为什么 nohup 后台进程被杀死?

Man*_*ian 11 nohup background-process

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

nohup python3 run.py > nohup.out &
Run Code Online (Sandbox Code Playgroud)

当远程会话关闭时,进程会被以下消息杀死:

捕获信号SIGHUP

SIGHUP 被捕获但没有被守护。退出。

我不明白;为什么进程在使用nohup &在后台启动时被杀死?

Jde*_*eBP 12

您的 Python 程序撤消nohup.

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

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

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

(即使这在 systemd 操作系统上也是不够的。因为 systemd 的人对他们的用户空间登录会话机制有点了解,你还需要确保 systemd 的机制是发出系统关闭而不是挂断信号的机制每次注销时的登录会话也没有启动。)

进一步阅读

  • 是他们的 Python 程序在做这件事,还是 Python 解释器(/运行时环境)在他们背后默默地做这件事? (3认同)
  • @JdeBP 我试过 `setsid nohup python3 run.py > nohup.out &`,**setsid** 已经解决了这个问题。这是一个正确的方法吗? (3认同)