systemd单ExecStart服务出现两个并行运行进程的原因是什么
问题原因
该现象通常和systemd配置无关,是以下几种常见情况导致的:
- 你启动的
CP_linux_test.exe二进制自身实现了主进程+工作子进程的架构,会主动fork出子进程处理业务,systemd的cgroup会将同一服务控制组下的所有子进程都展示出来,并非systemd重复启动了服务 - 你的二进制自带daemonize(后台自我守护)逻辑,而你配置了
Type=simple:simple类型要求程序不能主动后台退出,否则systemd会判定主进程异常退出,触发Restart=on-failure规则重新拉起新进程,旧的fork出来的后台进程还残留就会出现两个进程 - 服务之前的进程没有被正确清理,修改配置重启时新旧进程同时存在
排查步骤
- 验证进程父子关系:执行命令
ps auxf | grep -A2 -B2 CP_linux_test.exe,如果进程1627的PPID(父进程ID)是1625,就属于程序主动fork的正常场景 - 验证程序是否自带后台运行逻辑:直接在终端执行
/usr/lib/name_deamon/CP_linux_test/CP_linux_test.exe,如果执行后立刻返回终端提示符,说明程序会主动后台运行,和Type=simple配置不兼容 - 排查残留进程:执行
systemctl --user stop name.service后,再执行ps aux | grep CP_linux_test.exe,如果还有对应进程存在,说明之前的进程未被正常清理 - 查看服务日志:执行
journalctl --user -u name.service,检查是否有重复的服务启动记录,确认是否触发了自动重启规则
解决方法
- 若为程序正常fork子进程:无需任何修改,属于业务正常运行的表现,systemd展示的Tasks=2也和进程数匹配
- 若为程序自带后台运行逻辑:将服务配置中的
Type=simple修改为Type=forking,执行systemctl --user daemon-reload后重启服务即可 - 若为进程残留:可在服务配置的[Service]段添加
KillMode=mixed,确保停止服务时systemd会杀掉该服务控制组内的所有进程,避免残留;每次修改配置后先停止服务,确认无残留进程后再启动
内容的提问来源于stack exchange,提问作者adamaaa
相关产品推荐
相关产品推荐

