Systemd

如果 After=/Requires= 中的依賴項不存在,systemd 會失敗嗎?

  • March 17, 2022

我有一個服務 A,它在有限數量的環境中執行,為主機提供一些文件。我有另一個在所有環境中執行的服務 B。如果它們都在同一環境中執行,我希望 B 依賴(並且僅在之後開始)A。

我想根據這裡的答案簡單地添加一個After=A和到 BRequires=A

  • After僅檢查該單元是否已啟動,並且不明確啟動指定的單元。
  • 中列出Requires的單元與該單元一起被啟動。如果任何所需的單元未能啟動,則該單元不會被啟動。

這似乎表明需要這兩個After=Requires=來確保在(B) 單元之前啟動依賴項。

但是,如果指定的單位不存在會發生什麼,即。在服務A不執行的環境中?依賴項是無操作的嗎?

至少從 systemd v219 開始:

  • After=A當 A 不存在時,向 B添加 a是無害的;B 仍將啟動。
  • 當 A 不存在時,將 a 添加Requires=A到 B 中幾乎是無害的;當 B 啟動時,您會在日誌中收到一條消息,大意是:“無法為單元 b.service 添加依賴項作業,忽略:未找到單元。” 但 B 仍將啟動。

請注意,Requires=選項與Type=選項密切相關!

  • 如果服務 A 是“簡單”類型(預設),systemd 將在 ExecStart 程序被分叉後立即認為它被啟動,這是該服務完成工作之前!
  • 如果服務 A 是“分叉”類型,那麼 systemd“將考慮在父程序退出時啟動單元”,這可能是您在這種情況下想要的。

引用自:https://serverfault.com/questions/1062205