You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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或者KillSignalFinalKillSignal这些配置,但针对你当前的需求,KillMode=process完全够用。

内容的提问来源于stack exchange,提问作者GM6

火山引擎 最新活动