我有几个 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.service
和man 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
长期运行的服务可能不是很“惯用”。当程序运行时,此类服务的状态将显示为“正在启动”,而不是“正在运行”。
这些模式都不是很优雅,但编写起来相当容易,我认为它们应该可以正常工作:-)。