通常不在这里发帖,但我正在为这个发帖。我有一个 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.pyServer.py 派生并写入 pid 文件 systemdServer.py 然后根据其指令在 gnu 屏幕中生成服务器进程Server.py 继续运行以执行从服务器请求的任何重新启动在不使用 的情况下 启动时systemd,Server.py可以重新启动并且screens它启动的 GNU不受影响。当使用 启动时systemd,当Server.py关闭时,这些屏幕进程不会被孤立到 pid …