Systemd

systemd:在失敗時停止引導過程(實際上是關閉)

  • July 6, 2016

如果 oneshot 服務失敗,如何立即停止啟動過程,顯示一些消息(退出啟動螢幕)並關閉機器?

我的服務只啟動一個腳本。如果出現問題,或者更好地說,如果發生特殊情況,我想關閉機器。到目前為止,我試圖在腳本中放入一個systemctl poweroff. 但不幸的是,此呼叫立即返回,並且啟動過程繼續正常進行,或多或少並行關閉。在我的情況下,登錄螢幕會出現幾秒鐘,直到最終完成關機。

這是我的單位文件:

[Unit]
Description=My Fancy Script
Before=NetworkManager.target

[Service]
Type=oneshot
ExecStart=/path/to/script
StandardOutput=journal+console

[Install]
WantedBy=basic.target

我什至嘗試使用FailureAction=,但這也不起作用。

任何想法如何做到這一點?必須有一個“典型”的方式。例如,如果無法載入掛載點,則係統將進入維護模式(此 ctrl-D 東西 ;) )併中斷啟動。

必須有一個“典型”的方式。例如,如果無法載入掛載點,系統將進入維護模式併中斷啟動。

就在這裡。如果你看/usr/lib/systemd/system/local-fs.target你會發現它是

OnFailure=emergency.target
OnFailureJobMode=replace-不可逆

我看到了幾個選項。一種是殘酷的選擇,它可能適用於無法被破壞的無狀態系統。也就是添加--force選項到poweroff

poweroff --force

它的文件說:“強制立即停止,關閉電源,重新啟動。不要聯繫初始化系統。”。

其他服務將繼續並行啟動,但斷電應該更快。


您看到的行為是因為 systemd 試圖通過盡可能多的並行操作來盡可能快地引導您的系統。這意味著一旦滿足依賴關係,它就會繼續執行下一個任務,而不一定是在服務完成執行時。

由於登錄螢幕和其他服務不依賴於您的服務執行,因此它們是並行啟動的,即使關閉序列已經開始執行。

您可以通過強制啟動過程暫停並等待您的任務完成後再繼續來解決您的問題。首先,決定在您的自定義服務完成之前應該啟動哪些服務,然後使用新的Before=條目將這些服務或目標添加到您的文件中。

引用自:https://unix.stackexchange.com/questions/294199