我有幾個 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
長期運行的服務可能不是很“慣用”。當程式運行時,此類服務的狀態將顯示為“正在啟動”,而不是“正在運行”。
這些模式都不是很優雅,但編寫起來相當容易,我認為它們應該可以正常工作:-)。