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]
# 服务名称,可自定义
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服务
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
打印指定服务的命令行使用帮助。
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
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
;;
*)
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
本文原创地址://gulass.cn/srjxnmlhtyxc.html编辑:刘遄,审核员:暂无