systemd服务重启失败默认不重试,需配置restart=always、restartsec、restartpreventexitstatus及oompolicy等参数并执行daemon-reload、reset-failed和show验证。

systemd 服务重启失败时默认不重试
Linux 用 systemd 管理服务,但默认配置下服务崩溃退出后不会自动重启——哪怕你写了 Restart=always,也得配合 RestartSec 和正确的退出码逻辑,否则可能“看似配置了,实则没生效”。
常见错误现象:systemctl status myapp 显示 inactive (dead),日志里只有一次启动记录,没看到重启动作;或者服务刚起来几秒就挂了,systemd 却不再拉起。
-
Restart=always确实会重启,但若进程退出码是 0(比如正常 exit(0)),systemd会认为“这是主动退出”,不触发重启——除非你加RestartPreventExitStatus=0 -
RestartSec=5很关键:不设这个值,某些版本 systemd 会在重启前等 100ms,导致高频崩溃时被节流(journald 日志里能看到throttling restart) - 如果服务依赖网络或数据库,建议加
StartLimitIntervalSec=60和StartLimitBurst=5,避免启动风暴拖垮系统
如何让服务在 OOM 后真正重启
Linux 内核杀掉进程的 OOM killer 不会发标准信号,systemd 默认收不到“异常退出”事件,所以即使配了 Restart=on-failure,OOM 后也不会重启。
必须显式告诉 systemd:OOM 也算失败。否则它只认 SIGTERM/SIGKILL 或非零退出码。
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
- 在 service 文件里加
OOMPolicy=continue(systemd v249+)或更通用的KillMode=control-group+Restart=on-abort -
Restart=on-abort覆盖 OOM、SIGABRT、内核 panic 杀进程等场景,比on-failure更宽泛 - 验证方法:手动触发 OOM(如用
stress-ng --vm 1 --vm-bytes 2G),然后看journalctl -u myapp -n 50是否出现多次Started记录
supervisord 还值得用吗?对比 systemd 的真实短板
很多人因为习惯或历史原因继续用 supervisord,但它在现代 Linux 上有明确局限:无法感知 cgroup 资源限制、不集成 journalctl 日志、重启策略粒度粗(比如不能按退出码区分处理)。
典型坑点:supervisord 自己被 OOM kill 后,它管的所有子进程全丢,且无恢复能力;而 systemd 可以设 RestartSec + StartLimitAction=reboot 做兜底。
- supervisord 的
autorestart=true对 SIGKILL 无效(比如手动kill -9),而systemd的Restart=always可覆盖 - supervisord 日志默认写文件,排查时要切路径、查权限;
systemd直接journalctl -u xxx就行 - 如果必须用 supervisord(比如旧容器环境),至少加
killasgroup=true和stopasgroup=true,避免子进程变僵尸
重启策略生效前必做的三件事
改完 .service 文件不等于策略立刻生效——systemd 有缓存、依赖链和状态残留,跳过检查大概率白配。
- 运行
sudo systemctl daemon-reload,否则新配置完全不读取(很多故障就卡在这步) - 用
sudo systemctl reset-failed myapp清除上一次失败标记,否则StartLimit可能已触发拒绝启动 - 用
sudo systemctl show myapp | grep -E "(Restart|StartLimit|OOM)"确认实际加载的值,别信编辑器里的注释
复杂点在于:重启行为受全局 DefaultStartLimitIntervalSec 影响,且不同发行版 systemd 版本对 RestartPreventExitStatus 支持程度不一——配完一定要用 systemctl kill -s SIGSEGV myapp 模拟崩溃测一遍。









