我尝试通过远程会话启动 shell 脚本,该会话使用命令在后台启动进程。
nohup python3 run.py > nohup.out &
当远程会话关闭时,进程将被终止并显示以下消息:
捕获信号 SIGHUP
SIGHUP 已捕获但未被守护。退出。
我不明白;为什么进程在后台启动时会被杀死诺哈普 &?
答案1
您的 Python 程序会撤消nohup
.
nohup
忽略挂断信号,SIG_IGN
然后在同一进程中链式加载您的程序。
你的Python程序及时重置挂断信号的信号处理,安装自己的信号处理程序。该处理程序检查一个内部函数(该函数设计得不是很好,基于一些有缺陷的假设,如果它是我所见过的),并决定在收到挂断信号后的适当操作过程是打印该消息并退出。
你的Python程序在设计上是不可行nohup
的。在具有作业控制 shell 和 POSIX 会话/作业语义的系统上,您需要disown
ing 作业,以便 shell 永远不会知道它,从而首先向它发送挂断信号。
(即使这在 systemd 操作系统上还不够。因为 systemd 的人已经对他们的用户空间登录会话机制做了一些研究,所以您还需要确保 systemd 的机制发出系统关闭而不是挂断的信号,以每次注销时的登录会话也不会启动。)