关闭shell后让程序继续运行的方式

  最近在Linux下执行了jmeter测试脚本,启动程序后,关闭shell后,然后再登录shell,发现启动的脚本停止了,莫名其妙。原来,如果直接执行脚本,当关闭shell时,启动的脚本进程也跟着结束了。

  原因:当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。

  解决办法:要么让进程忽略HUP信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

nohup和&方式

  nohup 的用途就是让提交的命令忽略** HUP(hangup)** 信号,即忽略掉挂起信号 ;通过nohup --help命令查看基本介绍:
在这里插入图片描述
  nohup的使用比较简单,只需在命令前加上nohup就可以了,标准输出和标准错误缺省会被重定向到 nohup.out文件中;但是一般可在结尾加上&来将命令同时放入后台运行,还可以添加输出的重定向到指定的文件。

示例

# xxx.sh是你要执行的命令 > log.txt表示添加输出的重定向到log.txt文件
# 2>&1 标准输出和标准错误信息  &后台运行
[root@izwz9938t1plpkmgu0gexcz ~]# nohup xxx.sh  > log.txt 2>&1 &
disown命令

  用于命令已经在执行中的情况,但是并没有忽略挂起信号的方式,通过disown命令可以避免 HUP 信号的影响。通过ctrl+z将程序挂起到后台暂停运行,然后执行其他操作。分两种情况,一种是进程已经使用&放到后台运行了的(无需ctrl+z),另外一种是前台运行的情况,即没有使用&(需要ctrl+z).

使用了&的情况示例

[root@izwz9938t1plpkmgu0gexcz ~]#  ping  www.baidu.com > ping.txt  &
[1] 316
#通过jobs可以查看被挂起的工作进程
[root@izwz9938t1plpkmgu0gexcz ~]# jobs
[1]+  Running                 ping www.baidu.com > ping.txt &
# 使得进程忽略HUP信号,disown -h %1  %1:指的是上面的job号,对应1(第一个作业).
[root@izwz9938t1plpkmgu0gexcz ~]# disown -h %1
# 然后logout后,再次登录进去进程依然还在。

未使用&的情况示例

[root@izwz9938t1plpkmgu0gexcz ~]#  ping  www.baidu.com > ping.txt

#按ctrl+z后,通过jobs可以查看被挂起的工作进程
[root@izwz9938t1plpkmgu0gexcz ~]# jobs
[1]+  Stopped                 ping www.baidu.com > log.txt
# bg %1将进程放到后台运行
[root@izwz9938t1plpkmgu0gexcz ~]# bg %1
[1]+ ping www.baidu.com > log.txt &
# 使得进程忽略HUP信号,disown -h %1  %1:指的是上面的job号,对应1(第一个作业).
[root@izwz9938t1plpkmgu0gexcz ~]# disown -h %1
# 然后logout后,再次登录进去进程依然还在。
Logo

更多推荐