尽管使用nohup调用了进程,但即使收到SIGHUP,进程如何继续运行?

时间:2014-09-22 19:01:11

标签: python nohup

我正在测试用nohup调用的命令是否确实没有得到SIGHUP信号。

我确认如果我使用PuTTY登录我的CentOS框,运行nohup python foo.py &,其中foo.py包含无限循环,如果我杀了PuTTY,python程序仍然会继续运行。

然后我编写了sig.py来处理并将收到的所有信号记录到sig.txt中。

import signal, os

def handler(sig, frame):
    f = open('sig.txt', 'a')
    f.write('signal: ' + str(sig) + '\n')
    f.close()

for i in range(1, 20):
    if i in [9, 19]:
        continue
    print 'Setting signal handler for', i
    signal.signal(i, handler)

f = open('sig.txt', 'w')
f.write('start\n')
f.close()

while True:
    pass

然后我在PuTTY终端中运行nohup python sig.py &。然后我关闭了PuTTY终端。

我打开一个新的PuTTY终端并检查sig.txt的内容,我发现它。

$ cat sig.txt
start
signal: 1

所以似乎正在运行的进程仍然收到SIGHUP。

如果正在运行的进程仍然收到SIGHUP,那么在使用SIGHUP调用时它是如何保持活着的呢?

1 个答案:

答案 0 :(得分:0)

根据维基百科nohup ignores SIGHUP而disown实际上prevents信号被发送。在你的python脚本中,你会经历并设置所有信号的信号处理程序,从而覆盖nohup功能。