如何配置systemd服务使子进程在服务停止时不被终止?
解决systemd服务终止时Node.js子进程被连带终止的问题
这个问题我之前排查过,核心原因是systemd默认的进程终止策略在起作用。
为什么会出现这个差异?
当你用systemd管理服务时,默认的KillMode=control-group会让systemd终止整个控制组内的所有进程——包括你的Node主进程和它fork出来的子进程。而手动运行myNodeApp.js时,父进程被终止后,子进程会变成孤儿进程,被init/systemd接管,自然就能继续存活。
修改方案:调整KillMode配置
你只需要在[Service]区块里添加一行KillMode=process,就能让systemd只终止主进程(也就是ExecStart启动的那个node进程),而不会去处理它的子进程。
修改后的完整配置如下:
[Service] ExecStart=/usr/bin/node /myNodeApp.js Restart=always RestartSec=1 KillMode=process # 新增这一行,指定只终止主进程 [Install] WantedBy=multi-user.target
生效步骤
修改完配置文件后,别忘了重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart your-service-name.service
额外说明
如果之后你需要更精细的控制(比如终止主进程但保留特定子进程),可以研究下KillMode=mixed或者KillSignal、FinalKillSignal这些配置,但针对你当前的需求,KillMode=process完全够用。
内容的提问来源于stack exchange,提问作者GM6




