Systemd

如何處理 systemd 服務 ExecStartPre 行中的阻塞命令?

  • December 16, 2021

在我的備份程序 (btrbk) 可以將其備份發送到我的伺服器之前,我需要打開一個 VPN 連接。通過呼叫手動打開 VPN 連接可以正常工作

openvpn --config VPNConfig.ovpn

我現在創建了一個應該啟動備份的 systemd 服務(每天由 systemd 時間觸發)。作為先決條件,它因此應該連接到 VPN,因此有一個

ExecStartPre=openvpn --config VPNConfig.ovpn

服務文件中的行。然而不幸的是,這個 openvpn 呼叫是阻塞的,因此也阻塞了實際的備份過程被執行。

解決該問題的最佳方法是什麼?

提前致謝 :)

而不是使用ExecStartPre=,您應該為 OpenVPN 連接創建一個單獨的服務,指定它應該啟動Before=您的備份服務,並根據您的需要依賴於它:

如果您希望 VPN 連接為備份啟動並在備份完成後停止,您可以將 VPN 服務聲明為PartOf=您的備份服務。

如果備份完成後 VPN 可以/應該繼續執行,您可以將 VPN 服務指定為RequiredBy=備份服務。

如果您的備份 VPN 解決方案需要稍後更改,您可以只重寫或更換 VPN 服務單元,而無需觸及實際的備份單元或其計時器。

然後,您將從 VPN 服務中省略 common WantedBy=multi-user.target,因此啟動它的唯一方法是通過依賴項或通過顯式systemctl start命令。

並且套用 Aperture Science 的廣告文案,現在您正在考慮單位。

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