Networking

systemd 單元文件:依賴項“After=/Before=”不起作用

  • March 17, 2022

我正在嘗試在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

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