如何僅在啟動時執行服務依賴項?
我有一個長期執行的 systemd 服務,我們稱之為
db.service
. 它可以在系統啟動時啟動,但也可以手動重新啟動。我還有一個
oneshot
服務,我們稱之為它check.service
,它對數據庫文件執行完整性檢查。
check.service
應該在系統啟動時執行,並且在啟動過程中如果失敗db.service
則不應啟動。check.service
但!這裡是警告:當使用手動重述
check.service
時不應該執行。 即使啟動失敗,也應該可以手動啟動。db.service``systemctl restart db.service``db.service``check.service
問題
有沒有辦法使用 systemd 服務來實現這一點?
想法和觀察
- 我雖然可以通過使用
RequiredBy=db.service
in來實現這一點check.service
。但這仍然會在啟動check.service
時觸發db.service
。- 也許可以通過創建第三個服務 以某種方式解決該問題
db-boot.service
,該服務依賴於 bootdb.service
和check.service
. 但我一直無法弄清楚如何。
你需要
check.service
是Type=oneshot
withRemainAfterExit=yes
,它也需要是WantedBy=db.service
and 有序的Before=db.service
然後在啟動時(或在數據庫第一次啟動之前,如果數據庫未配置為在啟動時啟動),
check.service
執行完成並保持active (exited)
狀態。所以當db.service
重新啟動時,check.service
已經處於活動狀態並且滿足依賴關係,所以check.service
不會重新啟動。使用此設置,如果
check.service
啟動失敗,db.service
將不會啟動(但由於使用Want
依賴項而不是Require
,系統的其餘部分將正常啟動,而不是進入緊急模式)。如果db.service
再手動啟動,則需要check.service
先執行一次成功。check.service
執行成功後,db.service
即可隨意啟停。如果
db.service
需要能夠在check.service
失敗時手動啟動,那麼您可能想要配置db.service
為根本不自動啟動(即systemctl disable db.service
),並刪除WantedBy=db.service
fromcheck.service
。相反,當且僅當檢查成功時,您才會check.service
顯式執行。sudo systemctl start db.service
這樣,手動啟動時將不需要
check.service
執行依賴項,但只有在檢查成功時才會自動啟動數據庫(大概在啟動時)。db.service``check.service