nohup使用总结

二维码
| Jan 07, 2019 | 原创

简单言之,nohup的意思是屏蔽进程接收SIGHUP信号,因为该信号在*nux下的默认处理方式是终止进程运行,如果因为SIGHUP信号而导致我们部署的daemon守护进程终止退出的话,这可能不是我们想要的结果。

因此,只要在需要部署的守护进程前加上nohup, 让所需要启动的进程忽略掉该信号即可:

nohup /bin/test > test.log  &

那么,接下来我们需要总结一下,什么情况会产生SIGHUP信号呢?大概如下两种情况:

  1. 使用kill -HUP [processId]。
  2. 终端登录用户当前会话中运行的进程,在终端断开连接(不是exit, 是直接关掉)后会产生SIGHUP信号,当前会话进程包括前台进程,后台进程。

第一种情况比较好理解,下面简述一下第二种情况发送场景,我们通过如下步骤追踪发生的信号:

# 远程ssh登录某机器
ssh work@10.66.66.66

# 登录后启动某个后台进程
sleep 600 &

第一步登录远程服务器,使用sleep执行一个10分钟的后台进程,后台进程启动的时候,我们会在终端屏幕上输出类似的进程id:

sleep 600 &
[1] 7860

第二步,我们再启动另一个终端,远程登录该服务器,监听该进程是否收到SIGHUP信号:

ssh work@10.66.66.66
strace -e trace=signal -p 7860

第三步,我们尝试把第一个终端关掉,然后会在第二个终端收到如下信息,确实改程序收到了SIGHUP信号:

strace: Process 7860 attached
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=7595, si_uid=1000} ---
+++ killed by SIGHUP +++

但是,如果我们在尝试上面的步骤时,使用的是exit 命令, 你会发觉并不会收到SIGHUP信号。不光如此,我们还需要汇总一下另外几种常用的情况也不会收到SIGHUP信号:

  1. 远程登录后,启动后台进程,使用exit命令退出当前会话终端不会收到SIGHUP信号。
  2. 远程登录后,使用su命令切换到另一个账号,然后启动一个后台进程,此时如果强行关闭终端,此用户下的进程不会收到SIGHUP信号。
  3. 远程登录后,守护进程是放在一段shell脚本文件里被执行的,此种方式启动的进程在关闭终端也不会收到SIGHUP