2017-10-02 5 views
3

私はbashで同時に2つのコマンドを実行し、両方の成功を待ってから3番目のコマンドを実行したいと思います。また、これをtimeコマンドに含めることもできます。模式的に:私は中括弧の間のコマンドの成功を待たずに、「OK」すぐにプリントアウトし得る並列コマンドのセットが成功したときにコマンドを実行するにはどうすればよいですか?

time { { echo "hi" & sleep 5 & } && echo "ok"; } &> time.log 

:たとえば、私が実行し、場合

time { { cmd_1 & cmd_2 & } && cmd 3; } &> time.log 

。さらに、time.logファイルには、標準エラーと2つのコマンドの標準出力が角かっこで囲まれていますが、出力はtimeで、ファイルではなく端末のみに出力されます。

私は何かがクリアで簡単に欠けていると確信しています!このような

答えて

2

何か:

time (
    (sleep 5; exit 1) & pid1=$!      # process returns 1 and causes nok 
    (sleep 6; exit 0) & pid2=$! 
    wait $pid1 && wait $pid2 && echo aok || echo nok # wait for both and act accordingly 
) 2> time_out           # time outputs to std_err 

出力

nok 

最初のBG処理として、すべての子プロセスがその終了ステータスを無視して、終了した1

+0

このコマンドを使用する際に問題が発生しました。変数(X)に '(sleep 5; exit 1)&pid1 = $!' の出力を保存したときには動作しません: 'X = $(スリープ5;終了1)&pid1 = $! ' なぜですか? – Macspider

+0

私はそれがバックグラウンドに置かれると、出力は準備が整っておらず、バックグラウンドジョブは 'wait'でブロックするので、' $ X'は決してその値を取得しないと思います。値をファイルに書き込み、後でそれを読み込みます。 –

1

waitリターンを返します。 wait -nは、次の処理が終了して終了ステータスを返すときに戻ります。

子プロセスが2つあるので、wait -nを2つチェーンすることができます。

time { echo "hi" & sleep 5 & wait -n && wait -n && echo "ok"; } &> time.log 
関連する問題