您的 Python 程序会撤消nohup.

您的 Python 程序会撤消nohup.

我尝试通过远程会话启动 shell 脚本,该会话使用命令在后台启动进程。

nohup python3 run.py > nohup.out &

当远程会话关闭时,进程将被终止并显示以下消息:

捕获信号 SIGHUP

SIGHUP 已捕获但未被守护。退出。

我不明白;为什么进程在后台启动时会被杀死诺哈普 &

答案1

您的 Python 程序会撤消nohup.

nohup忽略挂断信号,SIG_IGN然后在同一进程中链式加载您的程序。

你的Python程序及时重置挂断信号的信号处理,安装自己的信号处理程序。该处理程序检查一个内部函数(该函数设计得不是很好,基于一些有缺陷的假设,如果它是我所见过的),并决定在收到挂断信号后的适当操作过程是打印该消息并退出。

你的Python程序在设计上是不可行nohup的。在具有作业控制 shell 和 POSIX 会话/作业语义的系统上,您需要disowning 作业,以便 shell 永远不会知道它,从而首先向它发送挂断信号。

(即使这在 systemd 操作系统上还不够。因为 systemd 的人已经对他们的用户空间登录会话机制做了一些研究,所以您还需要确保 systemd 的机制发出系统关闭而不是挂断的信号,以每次注销时的登录会话也不会启动。)

进一步阅读

相关内容