2017-09-02 10 views
1

bashファイルから2つのCコードを並列に開始し、2番目のコードを最初に終了すると停止します。 命令待ちは、どちらのプロセスが停止しているかを期待していますが、これは私がしたいことではありません。 ありがとうございます。Bashファイル:並列処理を実行し、終了時に停止する

+0

どのように2番目のものを停止しますか? "殺す"と? –

答えて

1

GNU parallelこの種のジョブを実行できます。 terminationセクションを確認し、それができ終了コード(成功または失敗のいずれかに基づいて、シャットダウンダウン残りのプロセス:ジョブがない場合は(仕事の一つが正常に終了すると、それは他のジョブにTERMシグナルを送信します

parallel -j2 --halt now,success=1 ::: 'cmd1 args' 'cmd2 args' 

)それはKILLシグナルを使用して強制的に終了さ

+1

ありがとうございます。私はGNUの並列20130922でこのコマンドを試しましたが、チュートリアルの次のリンクに示していますが、値は "now、success = 1"は無効です(期待される数値) – baptiste

+0

バージョン* 20161222 *(Ubuntu 17.04 defaultバージョン)が動作します。この変更は[2015年中に]導入されたようです(http://git.savannah.gnu.org/cgit/parallel.git/commit/?id=8110572719461a6019b8f4c22d5ebf43f65cfbe6)。以前の形式のように見える* - halt -2 *を試してみてください。 –

+1

さて、それは動作します。そして、最初のものが成功したときに停止するのではなく、最初のものが失敗したときに停止します。それから、コマンドの最後に私が最初に終わることを知っているエラーを導入しました。 – baptiste

0

wait -nはあなたが探しているものです。次のジョブが完了するのを待ちます。残りのジョブのPIDのリストをjobs -pとしておくと、それらのジョブを強制終了できます。

0
prog1 & pids=($!) 
prog2 & pids+=($!) 

wait -n 

kill "${pids[@]}" 

これは、bashを必要とします。

2つのプログラムはバックグラウンドジョブとして起動され、シェルは1つが終了するのを待ちます。

この場合、killが両方のプロセスを終了するために使用されます(どちらかがすでに停止しているため、エラーが発生します)。

0

$!を使用すると、並行して実行された最後のコマンドのPIDを取得し、ここでいくつかの素晴らしい例を参照してください:。。

:あなたの特有の問題については Bash `wait` command, waiting for more than 1 PID to finish execution

を私はのようなものを想像します

#!/bin/bash 

command_master() { 
    echo -e "Command_master" 
    sleep 1 
} 
command_tokill() { 
    echo -e "Command_tokill" 
    sleep 10 
} 

command_master & pid_master=($!) 
command_tokill & pid_tokill=($!) 
wait "$pid_master" 
kill "$pid_tokill" 
+0

ありがとうございます。 killするプロセスは、Cコードです。これは、killされ、ファイルを閉じる時間があることを伝えたいと思います。基本的に、マスタからプロセスにシグナルを送信して、ループに入り、最終的な操作が終了するようにします。それは可能ですか? – baptiste

+0

たとえば、マスタが終了したら、Cコードの最後のループに入るように、CファイルにrunMe.cをrunMe 1で送信します。 – baptiste

+0

私はあなたの問題を理解しています。残念ながら、私は提案するクリーンなbashソリューションはありません。クリーンな解決策のためには、いくつかの同期を処理しなければならず、bashが本当に便利かどうかはわかりません。私の例では、例えば、以下のシナリオに対する保護はありません。「toKill」プロセスは、「マスター」プロセスの前に終了します。 "$ pid_master"待機中に、以前の "toKill"と同じPIDを持つ別のプロセスが起動すると、bash命令の "$ pid_tokill"は間違ったプロセスを強制終了します。 –

関連する問題