当服务以特定代码退出时(例如退出代码0),有没有办法让systemd关闭系统?

当服务以特定代码退出时(例如退出代码0),有没有办法让systemd关闭系统?

我有几个 Linux 机器,每个机器都运行一个服务。这是这些机器上运行的唯一重要进程。然而,有时由于服务中的一些内部状态更改,它会以退出代码 0 优雅地自行停止。我正在寻找的是一种在发生这种情况时关闭整个系统的惯用方法。基本上,我希望 systemd 在 myservice 服务以代码 0 退出时停止系统,并在 myservice 以非零结果代码退出时重新启动 myservice。

是否有捷径可寻?

答案1

/etc/systemd/system/my_unit.service

[Unit]
...
...

[Service]
Type=oneshot
ExecStart=/usr/bin/your_program
ExecStartPost=/usr/bin/systemctl poweroff
RestartSec=5
Restart=on-failure

[Install]
...
...

这很简单。另一个有趣的参数见man systemd.serviceman systemd.unit

答案2

[Unit]
...

[Service]
Type=exec  # or any other type you want, apart from "oneshot"
ExecStart=/usr/bin/your_program
ExecStopPost=/bin/sh -c \
        'if [ "$SERVICE_RESULT" = "success" ]; then systemctl poweroff; fi'
RestartSec=5
Restart=on-failure

如果您的服务是使用 编写的Type=oneshot,您将需要以下模式奥克斯德的回答反而。用于Type=oneshot长期运行的服务可能不是很“惯用”。当程序运行时,此类服务的状态将显示为“正在启动”,而不是“正在运行”。

这些模式都不是很优雅,但编写起来相当容易,我认为它们应该可以正常工作:-)。

相关内容