如何处理 systemd service ExecStartPre 行中的阻塞命令?

如何处理 systemd service ExecStartPre 行中的阻塞命令?

在我的备份程序 (btrbk) 将其备份发送到我的服务器之前,我需要打开 VPN 连接。通过调用手动打开 VPN 连接效果非常好

openvpn --config VPNConfig.ovpn

我现在创建了一个 systemd 服务(每天由 systemd 时间触发),该服务应该启动备份。作为先决条件,它应该连接到 VPN,因此有一个

ExecStartPre=openvpn --config VPNConfig.ovpn

服务文件中的行。然而不幸的是,这个 openvpn 调用是阻塞的,因此也阻塞了实际备份过程的执行。

解决该问题的最佳方法是什么?

提前致谢 :)

答案1

ExecStartPre=您应该为 OpenVPN 连接创建一个单独的服务,而不是使用,指定它应该启动Before=您的备份服务,并根据您的需要对其进行依赖:

如果您希望启动 VPN 连接以进行备份并在备份完成后停止,您可以声明 VPN 服务是PartOf=您的备份服务。

如果备份完成后 VPN 可以/应该保持运行,您可以指定 VPN 服务作为RequiredBy=备份服务。

如果您的备份 VPN 解决方案稍后需要更改,您只需重写或替换 VPN 服务单元,而无需触及实际的备份单元或其计时器。

然后,您将省略 VPN 服务中的公共项WantedBy=multi-user.target,因此启动它的唯一方法是通过依赖项或通过显式systemctl start命令。

套用 Aperture Science 的广告词,现在你正在考虑单位。

相关内容