systemd
起動時に実行したい2つのスクリプトがあります。
最初のシステムスクリプトはOpenVPNを起動し、接続されたIPをファイルに書き込むシェルスクリプトを実行します
vpn.env
。2番目のシステムスクリプトはTransmissionを開始し、TransmissionのIPアドレスにバインドする必要があります
vpn.env
。
私の問題は、2番目のシステムスクリプトがあまりにも「高速」で実行され、OpenVPNが起動して書き込み前に完了することですvpn.env
。
質問:2番目のスクリプトに遅延(おそらく数秒)を追加し、環境ファイルが記録されるのを待つ方法はありますか?
システム化された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
システム転送スクリプト
[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
または、システムのOpenVPNサービスファイルでこれを行うこともできます。
ExecStartPost=/bin/bash -c 'do_bash_loop_that_waits_till_file_appears_here'
別のオプション:systemdを生成する.path 単位ファイル。おそらく、vpn.envファイルが作成または変更されるたびにトリガーされます。