小编Bot*_*ana的帖子

Systemd 和进程生成:主进程退出时子进程被杀死

通常不在这里发帖,但我正在为这个发帖。我有一个 Python 脚本,它在启动时分叉,并负责启动一堆其他进程。这个脚本曾经在启动时sysvinit通过systemd.

不幸的是,我遇到了一个无法解决的问题。当您直接在用户 shell 中启动脚本时,它会正确启动它的子进程,而当脚本退出时,子进程将被孤立并继续运行。

当通过 systemd 启动时,如果父进程退出,子进程也会全部退出(好吧,screen它们在 die 中启动并显示为 Dead)。

理想情况下,我需要能够在不杀死所有子进程的情况下重新启动父脚本,我是否遗漏了什么?

谢谢!

[Unit]
Description=Server commander
After=network.target

[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid

ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

编辑:

我可能需要指出 Python 脚本本质上是其子进程的“控制器”。它screen根据中央服务器的请求启动和停止 GNU 中的服务器。它通常一直在运行,它不会产生服务并退出。

然而,在某些情况下,我希望能够在不杀死子进程的情况下重新加载脚本,即使这意味着进程被孤立到 pid 1。事实上,如果 Python 脚本从进程开始,则无关紧要父进程,如果可能的话。

更好地解释它是如何工作的:

  • systemd 产卵 Server.py
  • Server.py 派生并写入 pid 文件 systemd
  • Server.py 然后根据其指令在 gnu 屏幕中生成服务器进程
  • Server.py 继续运行以执行从服务器请求的任何重新启动

不使用 的情况下 启动时systemdServer.py可以重新启动并且screens它启动的 GNU不受影响。当使用 启动时systemd,当Server.py关闭时,这些屏幕进程不会被孤立到 pid …

process-management systemd sysvinit

17
推荐指数
2
解决办法
2万
查看次数

标签 统计

process-management ×1

systemd ×1

sysvinit ×1