web-dev-qa-db-ja.com

起動時にsystemdスクリプトの実行を遅らせることはできますか?

起動時に実行したい2つのsystemdスクリプトがあります。

  1. 最初のsystemdスクリプトはOpenVPNを起動し、OpenVPNが接続スクリプトを実行して、接続のIPをファイルvpn.envに書き込みます。

  2. 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
5
Winterflags

あなたの問題はType=simple VPNサービスの説明。 Arch wikimanual page を明確にします、少し:

Type=simple(デフォルト):systemdは、サービスがすぐに開始されると見なします。プロセスはforkしてはいけません。ソケットでアクティブ化されていない限り、このサービスで他のサービスを注文する必要がある場合は、このタイプを使用しないでください。

タイプを変更することで、おそらくこれを機能させることができます。

Type=oneshot:これは、単一のジョブを実行して終了するスクリプトに役立ちます。あなたが設定する可能性がありますRemainAfterExit=yesまた、systemdは、プロセスが終了した後もサービスがアクティブであると見なします。

8
Thomas Dickey

遅延を追加できます: 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ファイルが作成または変更されたときに起動する可能性があります。

0
rogerdpack