
我有許多必須重新啟動的服務單元文件,並且我不想將它們全部鍵入。是否有可能有一個目標或服務不知道如何啟動其他服務,而是將它們組合在一起,以便使用單一命令重新啟動它們?
如果我願意,如何撰寫我的 systemd 服務單元檔案或目標檔案systemctl restart one-to-rule-them-all
?
要求: 1. uber 目標希望啟動許多其他服務。 2. uber 目標不應該知道如何啟動這些服務。
當我嘗試這個時,sudo systemctl restart one-to-rule.target
沒有任何反應。
# /etc/systemd/system/one-to-rule.target
[Unit]
Description=One To Rule Them All
Requires=multi-user.target
Wants=program-api.service program-gui.service yet-another.service
After=multi-user.target display-manager.service
[Install]
WantedBy=graphical.target
這些單元中的每一個program-api.service
program-gui.service
yet-another.service
都已one-to-rule.target
啟用,並且它們似乎都已載入並處於活動狀態。我可以啟動機器,並且所有服務都按照我想要的方式運作。然而,我只想打字systemctl restart one-to-rule.target
什麼的,而不是重新啟動。
依賴圖看起來像這樣
$ systemctl list-dependencies one-to-rule.target
one-to-rule.target
● ├─program-api.service
● ├─program-gui.service
● ├─yet-another.service
● └─multi-user.target
$ systemctl list-dependencies --reverse one-to-rule.target
one-to-rule.target
● └─graphical.target
答案1
這可以工作,但是每個 .service 單元都必須具有PartOf=one-to-rule.target
才能將重新啟動傳播到它們。 (這實際上只是一個較弱的版本Requires=<…>.target
。)
不幸的是,無法直接在目標中指定相反的依賴項 (ConsistsOf) – 您需要擴充所有服務檔案。