如何根据ExecStartPre执行结果启动systemd服务

如何根据ExecStartPre执行结果启动systemd服务

我有一个守护进程,它在启动流程中使用 systemd 服务文件启动。我想根据脚本的执行结果启动守护进程。该脚本包含在 ExecStartPre 选项下的服务文件中

基于脚本执行结果,我必须处理如下所述的服务

  1. 如果脚本返回0、启动服务并继续bootup
  2. 如果1被返回,停止服务,不继续启动
  3. 如果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=

相关内容