起動時に実行したい2つのsystemd
スクリプトがあります。
最初のsystemdスクリプトはOpenVPNを起動し、OpenVPNが接続スクリプトを実行して、接続のIPをファイルvpn.env
に書き込みます。
2番目のsystemdスクリプトはTransmissionを開始し、vpn.env
のIPアドレスにバインドする必要があります。
私の問題は、2番目のsystemdスクリプトの実行が速すぎるため、OpenVPNがvpn.env
を開始して書き込む前に完了してしまうようです。
質問: 2番目のスクリプトに遅延(おそらく数秒)を追加して、環境ファイルが書き込まれるのを待つ方法はありますか?
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
あなたの問題はType=simple
VPNサービスの説明。 Arch wiki は manual page を明確にします、少し:
Type=simple
(デフォルト):systemd
は、サービスがすぐに開始されると見なします。プロセスはforkしてはいけません。ソケットでアクティブ化されていない限り、このサービスで他のサービスを注文する必要がある場合は、このタイプを使用しないでください。
タイプを変更することで、おそらくこれを機能させることができます。
Type=oneshot
:これは、単一のジョブを実行して終了するスクリプトに役立ちます。あなたが設定する可能性がありますRemainAfterExit=yes
また、systemd
は、プロセスが終了した後もサービスがアクティブであると見なします。
遅延を追加できます: https://stackoverflow.com/q/43001223/3245
または、systemd OpenVPNサービスファイルで次のようにすることもできます。
ExecStartPost=/bin/bash -c 'do_bash_loop_that_waits_till_file_appears_here'
そして別のオプション:systemd 。path unit file を作成します。そのvpn.envファイルが作成または変更されたときに起動する可能性があります。