Systemd
如何處理 systemd 服務 ExecStartPre 行中的阻塞命令?
在我的備份程序 (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 的廣告文案,現在您正在考慮單位。