BASHシーケンス:出力を待ち、次のプログラムを起動します。
質問
私の場合私はSSH 'サーバーにsshされる前にopenvpn
を実行し、openvpn
コマンドは "初期化シーケンスが完了"。
SO、スクリプトはopenvpn
をセットアップしてからSSHを設定します。
私の質問は、バックグラウンドでBashでコマンドを実行し、別のプログラムを実行する前にエコー "完了"まで待っていますか?
私の現在の方法これは2つの端末ペインを開くことで、1つの走行:
sudo openvpn --config FILE
.
と他方の実行:
ssh SERVER
.
最初の端末ペインに「初期化シーケンスは完了」テキストを示しています。
解決
前景の標準的な処理でOpenVPNを実行するように見えます。< / P>
exec 3< <(sudo openvpn --config FILE)
sed '/Initialization Sequence Completed$/q' <&3 ; cat <&3 &
# VPN initialization is now complete and running in the background
ssh SERVER
.
説明
ピースに分割しましょう:
-
echo <(sudo openvpn --config FILE)
は/dev/fd63
のようなものを印刷します-
<(..)
は、バックグラウンドで openvpn を実行し、...
-
-
echo
でプリントアウトされているファイル記述子にその標準を添付します。
-
exec 3< /dev/fd63
.- ( / dev / fd63 はステップ1から印刷されたファイル記述子です)
- これは、読み取りのためにファイル記述子( / dev / fd63 )を開くようにシェルに伝えます...
- ファイル記述子
3
で利用できるようにします。
-
sed '/Initialization Sequence Completed$/q' <&3
.- 今度は、 sed を前景に実行しますが、ファイル記述子
3
から読み取ってください。
sed とすぐに、現在の行が「初期化シーケンスが完了した」で終了すると、( / Q 部分) - 今度は、 sed を前景に実行しますが、ファイル記述子
-
cat <&3 &
.- openvpn はファイル記述子に書き込まれ、最終的にはそれから読み取られない場合はブロックします
- それを防ぐために、バックグラウンドで cat を実行して出力 を読みます。
基本的なアイデアはバックグラウンドで3
を実行することですが、マジックワードを読み込むまでブロックする前景でコマンドを実行できるように、その出力をどこかにキャプチャすることです。上記のコードは、Messy一時ファイルを作成せずにそれを実行しようとしますが、一時ファイルを使用するだけではより簡単な方法があります。
他のヒント
Grepの-m 1
と一緒に--line-buffered
を使用して、連続ストリームで最初の一致後にgrepを終了します。これは機能するはずです:
sudo openvpn --config FILE | grep -m "Initialization Sequence Completed" --line-buffered && ssh SERVER
. 所属していません StackOverflow