我有一个守护进程,它在启动流程中使用 systemd 服务文件启动。我想根据脚本的执行结果启动守护进程。该脚本包含在 ExecStartPre 选项下的服务文件中。
基于脚本执行结果,我必须处理如下所述的服务
- 如果脚本返回0、启动服务并继续bootup
- 如果1被返回,停止服务,不继续启动
- 如果2被返回,不启动服务,但继续启动
我想知道我的场景是否有效。如果是的话如何实现这一点?
提前致谢。
答案1
systemd.service(5)
说:
ExecStartPre=, ExecStartPost= Additional commands that are executed before or after the command in ExecStart=, respectively. Syntax is the same as for ExecStart=, except that multiple command lines are allowed and the commands are executed one after the other, serially. If any of those commands (not prefixed with "-") fail, the rest are not executed and the unit is considered failed. ExecStart= commands are only run after all ExecStartPre= commands that were not prefixed with a "-" exit successfully.
因此,您可以使用非零退出代码来使服务失败。这满足您列表中的要求 1 和 3。这意味着如果ExecStartPre=
返回 0,服务就会启动并且一切都会继续启动。如果ExecStartPre=
不返回 0,则该服务将被标记为失败,而其他一切将继续启动。如果你打电话systemctl status
,你就会看到State: degraded
。
条件2有点令人困惑。 “不继续启动”是指“关闭”还是“systemctl stop multi-user.target”?如果此服务无法启动,您可能只是关闭系统,并且永远无法登录来解决问题(除非您进入某种类型的救援模式)。无论如何停止multi-user.target
或启动shutdown.target
,都不是您可以根据 的退出代码轻松完成的操作ExecStartPre=
。您需要将您的代码替换ExecStartPre=
为调用原始行并处理退出代码的 shell 脚本。
我怀疑你可能想要类似的东西Restart=on-failure
。可以根据主进程的退出代码重新启动服务(或者可以阻止重新启动),使用RestartForceExitStatus=
或RestartPreventExitStatus=