2017-01-24 4 views
2
によって生成されたすべてのジョブ
#!/bin/bash 

for i in {1..3}; do 
    sem --no-notice --id $$ -j+0 sleep 10 ";" echo Done 
done 

sem --no-notice --id $$ --wait 

起動し、それは、すべてのスリープを終了するにはCtrl + Cを作る方法?キルSEM

+0

パラレルを通常モードで使用するようにコードを書き換えることができるかどうかを確認してください。それから、それは箱の外で動く。 (そして、ビビテックスを1回だけ実行することを検討してください)。 –

答えて

1

SIGINTシグナルを捕まえて、セマフォによって生成されたすべてのプロセスを手動で削除するトラップを使用できます。次のスクリプトを見てください:

#!/bin/bash 
shopt -s nullglob #safety needed so that globs return empty strings when no files are present 
trap kill_sem INT 

function kill_sem() { 
     for s in ~/.parallel/semaphores/id-$$/*@*; 
     do 
       kill -15 -- -$(basename ${s%%@*}) 
     done 
} 

for i in {1..3}; do 
    sem --no-notice --id $$ -j+0 sleep 45 ";" echo Done 
done 

sem --no-notice --id $$ --wait 

説明:

  • trap kill_sem INT:他の言語行為多少と似try ... catchにブロックが、信号ではなく、例外を除いて。ここでは、INT信号(CTRL + C)を待ち、このときにkill_sem関数を実行します。 Link to trap documentation

  • あなたはsemとセマフォを作成すると、それは次の命名パターン使用してファイルを作成します。~/.parallel/semaphore/id-MYSCRIPT_PID/[email protected]

    • $(basename ${s%%@*}):これらのファイルのすべてからSEM_PIDを抽出し、中PID_GROUPとしてそれを使用するにはコマンド
    • kill -15 -- -PID_GROUP殺す:グループPID_GROUP
  • に属するすべてのプロセスに SIGTERM信号を送り、
関連する問題