2016-11-29 3 views
1

は次のようなものです:並行性と待機時間を持つ複数のコマンドを実行するにはどうすればよいですか?私が達成したい何

#!/bin/sh 
concurrency_limit 3 

#takes 5 min 
(/usr/bin/my-process-1 --args1 && /usr/bin/my-process-2 --args1) & 
#takes 10 min 
(/usr/bin/my-process-1 --args2 && /usr/bin/my-process-2 --args2) & 
#takes 15 min 
(/usr/bin/my-process-1 --args3 && /usr/bin/my-process-2 --args3) & 
#takes 5 min 
(/usr/bin/my-process-1 --args4 && /usr/bin/my-process-2 --args4) & 
#takes 10 min 
(/usr/bin/my-process-1 --args5 && /usr/bin/my-process-2 --args5) & 
#takes 20 min 
(/usr/bin/my-process-1 --args6 && /usr/bin/my-process-2 --args6) & 

wait max_limit 1200 
echo all processes complete 

全体的に予想される最大実行時間が20分( - + 1分)との私は3つのCPUコア用意して、私はしたくないと仮定してみましょう3つ以上のプロセスが同時に実行されています。

スクリプトの最初に3つのプロセスが開始されました。

5分後:第1のプロセスが終了し、第4のプロセスが開始された。

10分目:2番目と4番目のプロセスが終了し、5番目のプロセスが開始されました。

15分:3番目のプロセスが終了しました。

20分目:5番目のプロセスが終了しました。さらに待つことなく、6番目のプロセスが強制終了されます。

私はstackoverflowの中に多くの研究をしましたが、私は同様の使用方法のケースを見つけることができませんでした:

How to wait in bash for several subprocesses to finish and return exit code !=0 when any subprocess ends with code !=0?

https://www.codeword.xyz/2015/09/02/three-ways-to-script-processes-in-parallel/

http://www.gnu.org/software/parallel/

任意のヘルプやコメントは、おかげでいただければ幸いです。

+0

私の答え、または他の人があなたの問題を整理しましたか?もしそうなら、それをあなたの答えとして受け入れることを検討してください - 投票数の横にある緑色のチェックマーク/チェックマークをクリックしてください。そうでない場合は、私が、または他の誰かがあなたをさらに助けることができるように、何がうまくいかないと言ってください。ありがとう。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

答えて

1

xargsで実行できます。たとえば、以下の機能「FUNC」3つのパラレル・プロセスを使用して、引数3,3,4,1,4および15のために6回実行し、10秒後にそれを殺す:

function func { echo args:$1; sleep $1; echo done; } 
export -f func 

function worktodo { echo -e 3\\n 3\\n 4\\n 1\\n 4\\n 15 | xargs -P 3 -I {} sh -c 'func "[email protected]"' _ {}; } 
export -f worktodo 

timeout 10 sh -c "worktodo" || echo "timeout" 
1

はここにSIGINTを使用して、スケルトンです親とあなたのサブプロセス間の通信。

trap '{ let Trapped++; }' INT # start another child 

は、あなたが並列で実行したいどのように多くのことを初期化します:

Trapped=$ATONCE # 3 in your case 

その後忙しいどのように多くのプロセスカウントし、1が終了したときに、別のを開始するトラップを設定し

必要に応じてループを開始し、必要に応じて子を開始してください。 gのように:

call-external-process with parms 

# Deal with problems 
[[ $? -ne 0 ]] && { .... } 

# Now tell parent we're done 
kill -INT $$ 

それは粗い考えです。行方不明の場合は、プロセスを開始する必要がなくなり、エラー処理が改善される必要があるときの方法を知っていますが、うまくいけばよいと思います。常に3つのプロセスが実行されます.1つのプロセスが残されるまで、新しいプロセスが開始されます。

2

私が何かを見逃していない限り、私はGNUパラレルはあなたのためにそれを非常に容易にすると思います。

あなたはjobsと呼ばれるファイルが含ま作る場合:

その後
./my-process-1 --args1 && ./my-process-2 --args1 
./my-process-1 --args2 && ./my-process-2 --args2 
./my-process-1 --args3 && ./my-process-2 --args3 
./my-process-1 --args4 && ./my-process-2 --args4 
./my-process-1 --args5 && ./my-process-2 --args5 
./my-process-1 --args6 && ./my-process-2 --args6 

あなたはGNUは、次のように--dry-runを使用して行いますパラレルかを見ることができます。

parallel --dry-run -j 3 -k -a jobs 

出力を

./my-process-1 --args1 && ./my-process-2 --args1 
./my-process-1 --args2 && ./my-process-2 --args2 
./my-process-1 --args3 && ./my-process-2 --args3 
./my-process-1 --args4 && ./my-process-2 --args4 
./my-process-1 --args5 && ./my-process-2 --args5 
./my-process-1 --args6 && ./my-process-2 --args6 

my-process-1が3秒、my-process-2が5秒かかる場合は、最初の3行が並列に実行され、各行が8秒かかるため、次の3行が並列実行され、さらに8回実行されるため、秒。

+0

回答ありがとうございます。実行の合計時間制限はどうですか? – motto

+0

'timeout 120 parallel ...' –

関連する問題