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

EC2实例中systemd服务无法开机自启且进程终止后无法自动重启问题求助

EC2实例中systemd服务无法开机自启且进程终止后无法自动重启问题求助

看起来你已经搭好了基础的systemd服务配置,但遇到了自动启动和重启的卡点,我来帮你一步步排查解决:

第一步:先查日志定位具体错误

最关键的是先拿到服务启动失败的细节,systemd的日志会直接告诉你问题根源。执行这条命令查看详细日志:

journalctl -u test.service -xe

日志里会明确显示启动时的报错——比如路径拼写错误、权限不足、依赖没加载,这些都是这类问题的常见诱因。

第二步:验证脚本在目标环境下的可执行性

有时候不是systemd的问题,而是脚本在开机时的环境里跑不起来:

  • 切换到ubuntu用户手动模拟systemd的执行场景:
    su - ubuntu -c "/usr/bin/ruby /home/ubuntu/main/test.rb"
    
    如果这条命令执行失败,先优先修复脚本本身的问题(比如缺少Ruby依赖、文件路径错误)。
  • 检查权限:确认/usr/bin/ruby对ubuntu用户有执行权限,/home/ubuntu/main/test.rb有读和执行权限,用ls -l /usr/bin/ruby和ls -l /home/ubuntu/main/test.rb就能查看。

第三步:确认服务的启用状态

虽然你说已经启用了,但还是再核实一下,有时候启用命令可能因为权限或缓存问题没生效:

systemctl is-enabled test.service

如果输出不是enabled,重新执行启用命令再重启服务器测试:

systemctl enable test.service

第四步:调整Restart配置(解决进程杀死后不重启的问题)

你设置的Restart=on-failure,在进程被kill -9(SIGKILL信号)杀死时默认不会触发重启——因为SIGKILL属于systemd默认的RestartPreventExitStatus列表。如果希望这类强制杀死的场景也能重启,可以修改服务配置:

[Service]
# 保留其他原有配置
Restart=always
# 或者不想全局设置always的话,清空默认阻止规则
RestartPreventExitStatus=

修改后记得重新加载配置并重启服务:

systemctl daemon-reload
systemctl restart test.service

第五步:检查Type=simple是否适配你的脚本

如果你的Ruby脚本会自动后台化(比如调用了daemon相关方法),Type=simple就不适用了——systemd会误认为进程已经退出,不会持续监控它。这种情况有两个解决方向:

  • 修改脚本,让它保持前台运行;
  • 把Type=simple改成Type=forking,告诉systemd等待进程fork完成后再认定启动成功。

每做完一步调整,都可以用systemctl status test.service查看服务当前状态,确认配置是否生效。

备注:内容来源于stack exchange,提问作者Voley Betz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:27:47