Systemd
創建一個不關心狀態的“愚蠢”系統單元
我有一個應用程序應該在啟動期間啟動並在關機期間正常終止。問題是我無法確保應用程序是使用 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