Systemd

創建一個不關心狀態的“愚蠢”系統單元

  • December 13, 2020

我有一個應用程序應該在啟動期間啟動並在關機期間正常終止。問題是我無法確保應用程序是使用 systemd 啟動/停止的,這是一個相當複雜的應用程序,有時可能需要使用手動命令“部分”啟動,因此 systemd 沒有真正好的方法來跟踪應用程序的實際狀態。

所以,我得出的結論是,我需要一個“愚蠢”的 systemd 單元,它總是在啟動時執行某個腳本,在關閉時執行另一個腳本,無論服務的狀態如何。這就是我難以完成的事情。這是我用於測試的內容:

[Unit]
Description=My Test application
Wants=network-online.target 
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/user/tmp/systemd-test/script.sh start
ExecStop=/home/user/tmp/systemd-test/script.sh stop
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

上面的問題是,如果 start 之前沒有執行過,我不能讓它執行“停止”,反之亦然:

$ systemctl start test  # Start script is run
$ systemctl start test  # Nothing happens
$ systemctl stop test   # Stop script is run
$ systemctl stop test   # Nothing happens
$ systemctl stop test   # Nothing happens

因此,想像一下啟動腳本在啟動過程中由於任何原因失敗,應用程序管理員進入並手動啟動。然後停止腳本將不會在關閉期間執行,因為就 systemd 而言它從未正確啟動。

因此,我的問題是,有沒有辦法製作一個不關心狀態的“愚蠢”系統服務,還是我必須將它分成兩個不同的單元?

編輯:解釋一下為什麼我不能真正按預期使用 systemd 狀態:啟動應用程序首先涉及啟動一個“伺服器”程序,一旦啟動並執行啟動一個“啟動器”程序,該程序依次啟動 ~20針對不同類型的加工採用不同的工藝。並且一切都是非同步啟動的(即非阻塞),除了 grepping 日誌或呼叫自定義二進製文件以列出程序之外,無法知道事情何時真正啟動。因此,systemd 確實無法找出這 20 個程序中的一個是否啟動失敗。

因此,我的問題是,有沒有辦法製作一個不關心狀態的“愚蠢”系統服務

你可以試試這個(注意執行檔前的破折號):

ExecStart=-/home/user/tmp/systemd-test/script.sh start

或者

應用管理員進入並手動啟動

您可以讓他們通過 systemd 專門啟動腳本,例如檢查環境變數

test -z "$INVOCATION_ID" && echo "This script must be run via systemd" && exit

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