Networking
systemd 單元文件:依賴項“After=/Before=”不起作用
我正在嘗試在
systemd
單元文件中描述的兩個服務之間創建依賴關係:
- a.service 必須在 b.service 之前啟動
- b.service 如果 a.service 失敗則無法啟動
這是我所擁有的:
% cat a.service [Unit] Description=A-Service Before=b.service [Service] ExecStart=/opt/a.sh [Install] WantedBy=multi-user.target % cat b.service [Unit] Description=B-Service After=a.service [Service] ExecStart=/opt/b.sh [Install] WantedBy=multi-user.target
這是為服務 A 和 B 執行的簡單腳本:
% cat a.sh #!/bin/sh echo "A service started" exit 0 % cat b.sh #!/bin/sh echo "B service started" while [ true ]; do sleep 1 do exit 0
所以我試圖通過
exit 1
從返回來模擬/服務失敗a.sh
,將systemctl status a.service
其報告為失敗:Active: failed (Result: exit-code) ... Process: 843 ExecStart=/opt/a.sh (code=exited, status=1/FAILURE) ...
但是 b.service 仍然啟動並處於活動狀態:
% systemctl status b.service ... Active: active (running) ... Process: 844 ExecStart=/opt/b.sh (code=exited, status=0/SUCCESS) ...
此外,b.service 依賴項確實包含 a.service(狀態為 Fail):
% systemctl list-dependencies b.service ...
我究竟做錯了什麼?是腳本有問題還是
$$ Unit $$定義不完整?
我會
Requires
在第二個單元中使用一個屬性:如果該單位被啟動,列出的單位也將被啟動。如果其他單元之一未能啟動,並且在失敗單元上設置了順序依賴 After=,則不會啟動該單元。
我還將每個單元的類型更改為分叉,因為“簡單”的預設類型將認為一旦外殼啟動,單元就會啟動,而分叉單元將等待外殼退出。此類型更改僅對 A-Service 至關重要。
我也
Before=b.service
從 A-Service 中刪除了,因為從 B 到 A 的向後依賴(使用 B 的“After”指令)對我來說更有意義,你不必同時擁有兩者。生成的單元文件是:
[Unit] Description=A-Service [Service] Type=forking ExecStart=/opt/a.sh [Install] WantedBy=multi-user.target
和:
[Unit] Description=B-Service Requires=a.service After=a.service [Service] Type=forking ExecStart=/opt/b.sh [Install] WantedBy=multi-user.target