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

P A*_*A N 5 boot systemd

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

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

  2. 第二个 systemd 脚本启动传输并且应该绑定到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
Run Code Online (Sandbox Code Playgroud)

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

printenv > /etc/openvpn/vpn.env
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 9

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

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

您可能可以通过更改类型来完成这项工作:

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