如果 ExecStartPre 失敗,systemd ExecStopPost 不會運作?

如果 ExecStartPre 失敗,systemd ExecStopPost 不會運作?

systemd我已經查看了這裡的文檔https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStartPre=,ExecStartPost=它在部分中指出

請注意,如果 ExecStartPre=、ExecStart= 或 ExecStartPost= 中指定的任何命令失敗(並且沒有前綴“-”,請參見上文)或在服務完全啟動之前超時,則繼續執行 ExecStopPost= 中指定的命令,ExecStop =中的命令被跳過

我有一個ExecStartPre規則是

ExecStartPre=/bin/false

ExecStopPost我有一個/bin/echo "I'm at ExecStopPost".

服務看起來像

[Unit]
Description=Test

[Service]
Type=oneshot
ExecStartPre=/bin/echo "I'm at ExecStartPre"
ExecStartPre=/bin/false
ExecStart=/bin/echo "Running Test"
ExecStopPost=/bin/echo "I'm at ExecStopPost"

當它運行並失敗時,我永遠不會看到它。系統日誌的輸出看起來像

6 月 15 日 20:48:01 ip-10-0-0-246 echo[8687]:我在 ExecStartPre

6月15日20:48:01 ip-10-0-0-246 systemd[1]: test.service: 控制進程退出,代碼=退出狀態=1

6 月 15 日 20:48:01 ip-10-0-0-246 systemd[1]:無法啟動測試。

6 月 15 日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 單元進入失敗狀態。

6 月 15 日 20:48:01 ip-10-0-0-246 systemd[1]: test.service.service: 失敗,結果為「退出代碼」。

我從來沒有看到我的迴音。

journalctl -u test.service當然也有這個作為它的入口。

我需要對此進行稍微不同的配置嗎?或者我需要使用嗎OnFailure

我需要能夠Conflicts=在成功或失敗的情況下重新啟動。這將用於由計時器觸發的一次性服務。

哦,這是在 16.04.6 LTS 上運行的。

答案1

看來oneshot服務不會ExecStopPost在失敗時呼叫。這個連結討論了它https://bugzilla.redhat.com/show_bug.cgi?id=1353039

相關貼文是

只有當單元從運作狀態轉換(即使單元被終止)或主 PID 在啟動狀態下成功退出且服務不是分叉類型時,ExecStopPost 才會執行。

不同之處在於,對於單一性服務,當配置的 ExecStart 操作正在執行時,服務仍處於啟動狀態並且未執行。然而,對於簡單服務,systemd 會立即將服務轉換為運行狀態,即使 ExecStart 失敗(即 ExecStart=/bin/false),systemctl 也不會阻塞並傳回 exit 0。因此,oneshot 服務必須完全退出才能呼叫 ExecStopPost。 AFAICT,選項 RemainAfterExit 對 ExecStopPost 沒有影響。

解決方案最終添加了一個OnFailure來調用必要的項目,這些項目將被調用ExecStopPost

相關內容