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