You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

systemd单ExecStart服务出现两个并行运行进程的原因是什么

问题原因

该现象通常和systemd配置无关,是以下几种常见情况导致的:

  1. 你启动的CP_linux_test.exe二进制自身实现了主进程+工作子进程的架构,会主动fork出子进程处理业务,systemd的cgroup会将同一服务控制组下的所有子进程都展示出来,并非systemd重复启动了服务
  2. 你的二进制自带daemonize(后台自我守护)逻辑,而你配置了Type=simple:simple类型要求程序不能主动后台退出,否则systemd会判定主进程异常退出,触发Restart=on-failure规则重新拉起新进程,旧的fork出来的后台进程还残留就会出现两个进程
  3. 服务之前的进程没有被正确清理,修改配置重启时新旧进程同时存在

排查步骤

  • 验证进程父子关系:执行命令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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:03