當服務以特定代碼退出時(例如退出代碼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長期運行的服務可能不是很“慣用”。當程式運行時,此類服務的狀態將顯示為“正在啟動”,而不是“正在運行”。

這些模式都不是很優雅,但編寫起來相當容易,我認為它們應該可以正常工作:-)。

相關內容