shell关机脚本_linux关机前执行命令_linux 关机前执行脚本

nohup解读

nohup运行由Command参数和任何相关的Arg参数指定的,忽视所有挂断(SIGHUP)讯号。在注销后使用nohup运行后台中的程序。要运行后台中的nohup命令,添加&(表示“and”的符号)到命令的尾部。

nohup是nohangup的简写,就是不挂断的意思。

nohup命令:假如你正在运行一个进程,但是你认为在退出账户时该进程还不会结束,这么可以使用nohup命令。该命令可以在你退出账户/关掉终端以后继续运行相应的进程。

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。

nohup案例

1.nohuppython3main.py>>main.log2>&1&

在前面的事例中,0–stdin(standardinput),1–stdout(standardoutput),2–stderr(standarderror);

2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。诸如nohupcommand>myout.file2>error.txt&这么错误内容会输出到error.txt文件中

2.022***/usr/bin/python/home/pu/download_pdf/download_dfcf_pdf_to_oss.py>/home/pu/download_pdf/download_dfcf_pdf_to_oss.log2>&1

这是置于crontab中的定时任务,夜晚22点时侯怕这个任务,启动这个python的,并把日志写在download_dfcf_pdf_to_oss.log文件中

nohup和&二者的区别

&:指在后台运行

nohup:不挂断的运行linux 关机前执行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,比如我们断掉SSH联接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

&是指在后台运行,但当用户推出(挂起)的时侯,命令手动也跟随退出

这么,我们可以巧妙的吧她们结合上去用就是

nohupCOMMAND&

这样才能使命令永久的在后台执行

比如:

1.shtest.sh&

将shtest.sh任务放在后台,虽然关掉x退出当前session仍然继续运行linux下socket编程,但标准输出和标准错误信息会遗失(缺乏的日志的输出)

将shtest.sh任务放在后台,关掉xshell,对应的任务也跟随停止。

2.nohupshtest.sh

将shtest.sh任务放在后台,关掉标准输入,终端不再才能接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,虽然关掉xshell退出当前session仍然继续运行。

3.nohupshtest.sh&

将shtest.sh任务放在后台,并且仍然可以使用标准输入,终端才能接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,虽然关掉xshell退出当前session仍然继续运行。

systemd工具

借助systemd工具管理程序,实现服务开机自启动

1、systemd工具介绍

说道systemd工具,不得不提及service命令。它们是Linux服务管理的两种形式service和systemctl。但还是有区别,可以如此说:systemctl基本上是的更强悍的版本service。

①什么是service?

service命令是RedhatLinux兼容的发行版中拿来控制系统服务的实用工具,它以启动、停止、重新启动和关掉系统服务linux 关机前执行脚本,还可以显示所有系统服务的当前状态。

service命令实现的原理似乎是去/etc/init.d目录下,去执行脚本文件,init.d目录包含许多系统各类服务的启动和停止脚本。当Linux启动时,会找寻这种目录中的服务脚本。

②什么是systemctl?

systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。

在systemd管理体系中,被管理的deamon(守护进程)也称unit(单元),对于单元的管理是通过命令systemctl来进行控制的。unit表示不同类型的systemd对象,通过配置文件进行标示和配置;文件主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息。

2、编写systemctl脚本

①编写简单的systemctl脚本

编撰test.service丢到/usr/lib/systemd/system目录下

例一:


[Unit]
# 服务名称,可自定义

shell关机脚本_linux 关机前执行脚本_linux关机前执行命令

Description = frpc-server After = network.target syslog.target Wants = network.target ConditionPathExists = /etc/frp/frpc-start.sh [Service] Type = simple # 启动命令,改为实际存放frps的路径 RemainAfterExit=yes #KillMode=none WorkingDirectory=/etc/frp ExecStart = /etc/frp/frpc-start.sh ExecStop=kill -9 $MAINPID Restart=always [Install] WantedBy = multi-user.target

例二:

[Unit] 
# 服务名称,可自定义
Description=test.jar 
# 确保这些服务的前后顺序
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service] 
User=root
Group=root
# 启动命令
ExecStart=/opt/jdk1.8.0_161/bin/java  -server -Xms1024m -Xmx2048m -Dspring.profiles.active=production  -jar /root/test.jar
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
 
[Install] 
WantedBy=multi-user.target

把service后缀的文件置于指定目录中后,就可以用systemctl命令来管理程序了!

#启动test.service服务

shell关机脚本_linux 关机前执行脚本_linux关机前执行命令

systemctlstarttest.service

#查看服务状态

systemctlstatustest.service

疗效如下:

用这个也可以启动服务:

serviceteststatus

但重启后就用不了了

在你更改了.service文件后使用systemctl管理命令,可能会出现警告信息:

Warning:test.servicechangedondisk.Run'systemctldaemon-reload'toreloadunits.

这个时侯就要重新加载systemctl配置了,之后还会应用最新的配置。

systemctldaemon-reload

对于这些支持Systemd的软件linux更改ip地址,安装的时侯,会手动在/usr/lib/systemd/system目录添加一个配置文件。这个时侯你就可以直接用systemctl命令来管理了。

③用systemctl命令,让服务实现开机启动

到第②小节的步骤就早已可以用systemctl管理命令来管理你自己的程序了,若果你想让该程序开机启动,就执行下边的命令(以test.service为例)。

sudosystemctlenabletest

里面的命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system上面的test.service文件。

这是由于开机时,Systemd只执行/etc/systemd/system目录上面的配置文件。这也意味着,假如把test.service文件不使用符号链接而是直接放在/etc/systemd/system目录下,就可以实现开机启动。其实,在/usr/lib/systemd/system若果没有放test.service文件就用不了systemctl命令来管理程序了!

注意:systemctlstarttest也可以用systemctlstarttest.service

#启动test
systemctl start test
#停止test
systemctl stop test
#重启test
systemctl restart test
#查看状态test
systemctl status test
#如果需要开机启动
systemctl enable test
#如果需要取消开机启动
systemctl disable test
#杀进程,向正在运行的进程发出kill信号。
systemctl kill test
#查看test相关的service配置文件
systemctl cat test
##查看 multi-user.target 包含的所有服务
systemctl list-dependencies multi-user.target
#切换到另一个 target,shutdown.target 就是关机状态
sudo systemctl isolate shutdown.target

service的常用方式:
1.格式:service 

shell关机脚本_linux 关机前执行脚本_linux关机前执行命令

打印指定服务的命令行使用帮助。 2.格式:service start 启动指定的系统服务 3.格式:service stop 停止指定的系统服务 4.格式:service restart 重新启动指定的系统服务,即先停止(stop),然后再启动(start)。 5.格式:chkconfig --list 查看系统服务列表,以及每个服务的运行级别。 6.格式:chkconfig on 设置指定服务开机时自动启动。 7.格式:chkconfig off 设置指定服务开机时不自动启动。 8.格式:ntsysv 以全屏幕文本界面设置服务开机时是否自动启动。 打开redis命令:service redis start 关闭redis命令:service redis stop 设为开机启动:chkconfig redis on

用sh脚本让服务开机自启

1、创建sh脚本

请使用下述方法创建sh脚本:server.sh(脚本亲测好用,不用额外配置编辑)

注意:文件都要设置为可执行文件:

sudo chmod 755 run-server.sh

①使用notepad++软件转换成unix格式,或则用vim的setff命令来转换

notepad++官方下载地址

使用notepad++打开文件---编辑---文档格式转换---转为unix---上传至linux

②run-server.sh脚本代码如下:

对于一些未提供service管理的程序每次启动和关掉都要加上全部路径,想到可以做一个简单的启动和关掉控制的文件。

下边以scrapy启动server为例:

#端口号,根据此端口号确定PID
PORT=6800
#启动命令所在目录
HOME='/home/jmscra/scrapy/'
 
#查询出监听了PORT端口TCP协议的程序
pid=`netstat -lnopt | grep :$PORT | awk '/python/{gsub(//python/,"",$7);print $7;}'`
 
 
start(){
   if [ -n "$pid" ]; then

linux关机前执行命令_linux 关机前执行脚本_shell关机脚本

echo "server already start,pid:$pid" return 0 fi #进入命令所在目录 cd $HOME nohup scrapy server & #启动scrpayd服务器 把日志输出到HOME目录的nohup.out文件中 echo "start at port:$PORT" } stop(){ if [ -z "$pid" ]; then echo "not find program on port:$PORT" return 0 fi #结束程序,使用讯号2,如果不行可以尝试讯号9强制结束 kill -2 $pid echo "kill program use signal 2,pid:$pid" } status(){ if [ -z "$pid" ]; then echo "not find program on port:$PORT" else echo "program is running,pid:$pid" fi } case $1 in start) start ;; stop) stop ;; status) status ;; *)

linux关机前执行命令_linux 关机前执行脚本_shell关机脚本

echo "Usage: {start|stop|status}" ;; esac exit 0

测试使用时可以

/path/run.shstart启动

/path/run.shstop停止

/path/run.shstatus查看运行程序的pid

把前面这个脚本设置为开机自启的服务,可以用前面的systemd工具,把sh文件放在service文件中即可。下边用另一种方式自启。

系统rc.local文件实现自启

编辑系统rc.local文件,让脚本加入系统开机启动

在里面的第一步就可以使用脚本来管理程序了,接出来是让脚本加入到系统的开机启动

记录当前server.sh脚本的路径,编辑/etc/rc.d/rc.local。命令如下:

cd/etc/rc.d

virc.local

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
 
#就是说rc.local的程序已经启动了, 防止重复运行
touch /var/lock/subsys/local
 
#脚本的绝对路径
/root/run-server.sh
 

系统重启,查看疗效

sudo reboot

查看程序:

ps -ef | grep scrapy

本文原创地址://lrxjmw.cn/srjxnmlhtyxc.html编辑:刘遄,审核员:暂无