我有这个服务:
\n\n[Unit]\nDescription=TimeAgent Recorder\nRequires=timeagent.service\n\n[Service]\nUser=deployer\nGroup=sudo\nWorkingDirectory=/home/deployer/timeagent\nEnvironment=HOME=/home/deployer\nEnvironment=RAILS_ENV=production\nEnvironment=EYE_CLIENT_TIMEOUT=120\nRestart=always\nRestartSec=15\nNice=1\n\nType=forking\nPIDFile=/home/deployer/.eye/pid\nExecStart=/usr/local/bin/bundle exec eye load recorder.eye\nExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600\n\n[Install]\nWantedBy=timeagent.service\nRun Code Online (Sandbox Code Playgroud)\n\n重启后,有时无法启动:
\n\n$ systemctl status timeagent-recorder\n\xe2\x97\x8f timeagent-recorder.service - TimeAgent Recorder\n Loaded: loaded (/etc/systemd/system/timeagent-recorder.service; enabled; vendor preset: enabled)\n Active: inactive (dead) since Mon 2017-03-20 16:30:17 GMT; 42min ago\n Process: 10929 ExecStop=/usr/local/bin/bundle exec eye quit --stop-all -t 600 (code=exited, status=0/SUCCESS)\n Process: 11409 ExecStart=/usr/local/bin/bundle exec eye load recorder.eye (code=killed, signal=TERM)\n Main PID: 9236 (code=killed, signal=TERM)\n\nMar 20 16:30:16 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 20 16:30:17 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 20 16:30:17 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.\nMar 20 16:30:17 Ti systemd[1]: Failed to start TimeAgent Recorder.\nMar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.\nMar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.\nMar 20 16:30:20 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 20 16:30:20 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.\nMar 20 16:30:20 Ti systemd[1]: Failed to start TimeAgent Recorder.\nRun Code Online (Sandbox Code Playgroud)\n\n这也是一些相关的输出:
\n\n$ systemctl show timeagent-recorder | grep -i restart\nRestart=always\nRestartUSec=15s\nRun Code Online (Sandbox Code Playgroud)\n\n我确保启用该服务以及 daemon-reload,正如您在上面看到的那样,它已启用并且 systemd 尝试启动它,但完全忽略 RestartSec。
\n\n我使用的是 Ubuntu 16.04.1 LTS,systemd 版本为 229-4ubuntu10。
\n\n知道为什么 RestartSec=15 没有得到遵守吗?- 我还尝试使用 RestartSec=15s 这也没有什么区别。
\n\n编辑:
\n\n我已按照建议将“需要”更改为“想要”,但问题仍然发生。这是相关日志,更多地显示了正在发生的情况:
\n\n# journalctl -f -u timeagent-recorder\nMar 26 20:18:21 Ti bundle[7030]: Config loaded!\nMar 26 20:18:21 Ti systemd[1]: Started TimeAgent Recorder.\nMar 26 22:17:06 Ti systemd[1]: Stopping TimeAgent Recorder...\nMar 26 22:17:08 Ti bundle[22989]: Eye quit \xe0\xb2\xa0\xe2\x95\xad\xe2\x95\xae\xe0\xb2\xa0 (/home/deployer)\nMar 26 22:17:08 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:08 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 26 22:17:09 Ti bundle[23272]: Eye started! \xe3\x8b\xa1 (/home/deployer)\nMar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Control process exited, code=exited status=1\nMar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Unit entered failed state.\nMar 26 22:17:09 Ti systemd[1]: timeagent-recorder.service: Failed with result 'exit-code'.\nMar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 26 22:17:09 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:09 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:10 Ti systemd[1]: Starting TimeAgent Recorder...\nMar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.\nMar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.\nMar 26 22:17:10 Ti systemd[1]: Stopped TimeAgent Recorder.\nMar 26 22:17:10 Ti systemd[1]: timeagent-recorder.service: Start request repeated too quickly.\nMar 26 22:17:10 Ti systemd[1]: Failed to start TimeAgent Recorder.\nRun Code Online (Sandbox Code Playgroud)\n
我相信你所经历的行为是因为你的Requires=依赖。根据以下Requires=部分man systemd.unit:
如果其他单位之一被停用或激活失败,则该单位将被停用。
听起来这就是这里发生的事情。在本段后面,有这样的建议,我认为它适用于这种情况:
通常,使用 Wants= 而不是 Requires= 是更好的选择,以便使系统在处理故障服务时更加健壮。
的文档Wants=说:
Requires= 的较弱版本。如果配置单元已启动,则将启动此选项中列出的单元。但是,如果列出的单位未能启动或无法添加到交易中,这不会影响整个交易的有效性。这是将一个单元的启动与另一个单元的启动挂钩的推荐方法。
用另一种方式回答:我不认为“RequireSec=”逻辑有机会启动,因为 systemd 由于不满足“Require=”条件而取消了服务。
这是我的猜测。