出于什么原因 nohup 不能在特定的内部开发流程上工作?
我使用它如下:
/usr/bin/nohup process_a &
我可以关闭执行它的终端,看看它仍在通过 ps 运行。但是,在注销并重新登录后,该过程不再运行。
我可以在不同的内部开发的 process_b 上运行相同的 nohup 命令,并且注销并重新登录不会结束该进程。它仍在运行。
我想知道 process_a 有什么“特别”之处,以至于它无法在注销并重新登录后幸存下来。进程 a 和 b 都打开一个 TCP 服务器套接字,并且还具有用于日志记录的打开文件描述符。
我试过使用 bash、tcsh 和 zsh shell,结果都一样。
出于什么原因,在 nohup 下运行的一个进程会在注销/登录后幸存下来,而另一个则不会?我假设开发人员可以更改代码中的某些内容。
我们在相当严格的环境中运行 RHEL 6(screen、tmux 等不是可用的替代品)。
更新:
process_a 在以下情况下幸存下来
杀死 -s HUP PID
因此在这种情况下,似乎通过 nohup 成功处理了 SIGHUP。它仍然在注销时死亡。
如果 process_a 的代码显式捕获 SIGHUP(挂断信号)或将其重置为默认处理程序(即无;即退出),则可以解释您所看到的行为。要求开发人员搜索代码
SIGHUP
并查看它在做什么。如果您可以在该程序上运行,您可能能够更好地诊断这一点
strace
,但是,由于您有“相当严格的环境”,strace
因此可能不可用。如果您能够更快地进行测试并生成更多可操作的取证nohup process_a &
),ps
)运行,kill -HUP PID
此进程在 nohup 下运行时无法退出/登录的具体原因是它使用了 Motif。即使在我们的这个过程的环境中,GUI 没有被调用/实现,代码最终在其 main()(c 代码)中使用了 XtAppMainLoop。也许 Motif 库对 SIGNALS 做了一些事情。
其他答案/评论中建议的其他原因:
该进程显式捕获/重置 SIGHUP
该进程使用 tty 设备