Systemd

如何僅在啟動時執行服務依賴項?

  • February 25, 2022

我有一個長期執行的 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.servicein來實現這一點check.service。但這仍然會在啟動check.service時觸發db.service
  • 也許可以通過創建第三個服務 以某種方式解決該問題db-boot.service,該服務依賴於 bootdb.servicecheck.service. 但我一直無法弄清楚如何。

你需要check.serviceType=oneshotwith RemainAfterExit=yes,它也需要是WantedBy=db.serviceand 有序的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.servicefrom check.service。相反,當且僅當檢查成功時,您才會check.service顯式執行。sudo systemctl start db.service

這樣,手動啟動時將不需要check.service執行依賴項,但只有在檢查成功時才會自動啟動數據庫(大概在啟動時)。db.service``check.service

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