我可以延迟 systemd 脚本在启动时运行吗?

我可以延迟 systemd 脚本在启动时运行吗?

我有两个systemd要在启动时运行的脚本。

  1. 第一个 systemd 脚本启动 OpenVPN,然后执行一个 shell 脚本,将连接的 IP 写入文件vpn.env

  2. 第二个 systemd 脚本启动 Transmission 并应绑定到 中的 IP 地址vpn.env

我的问题似乎是第二个 systemd 脚本的执行太“快”,并且在 OpenVPN 可以启动和写入之前完成vpn.env

问题:有没有办法为第二个脚本添加延迟(也许几秒钟),并让它等待环境文件被写入?


systemd OpenVPN 脚本

[Unit]
Description=VPN Custom Launch Connection
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn --config /etc/openvpn/vpn.conf

[Install]
WantedBy=multi-user.target

OpenVPN .sh 脚本,程序启动时执行

printenv > /etc/openvpn/vpn.env

systemd 传输脚本

[Unit]
Description=Transmission BitTorrent Daemon Under VPN
After=network.target vpn.service
Requires=vpn.service

[Service]
User=transmission
Type=notify
EnvironmentFile=/etc/openvpn/vpn.env
ExecStart=/usr/bin/transmission-daemon -f --log-error --config-dir /opt/transmission --bind-address-ipv4 $ifconfig_local --rpc-bind-address 0.0.0.0 --no-portmap
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

答案1

您的问题出Type=simple在 VPN 服务的描述中。这拱门维基澄清了手册页, 一点:

Type=simple(默认):systemd认为服务立即启动。该进程不得分叉。如果需要在此服务上订购其他服务,请勿使用此类型,除非它是套接字激活的。

您可能可以通过更改类型来实现此目的:

Type=oneshot:这对于执行单个作业然后退出的脚本很有用。你可能也希望进行设置RemainAfterExit=yes,以便systemd在进程退出后仍将服务视为活动状态。

答案2

您可以添加延迟:https://stackoverflow.com/q/43001223/32453

或者可以在您的 systemd OpenVPN 服务文件中执行此操作:

 ExecStartPost=/bin/bash -c 'do_bash_loop_that_waits_till_file_appears_here'

另一个选择:创建一个 systemd.path 单元文件。也许每当创建或更改 vpn.env 文件时都会触发它。

相关内容