2017-12-07 4 views
-1

この例では、3つのコマンドを並行して実行しています。複数のコマンドを並行して実行して正常終了する

キーボードショートカットでコマンドを終了/終了すると、コマンドが出力されているようです。

➜ example: ✗ sh ./scripts.sh 
three 
one 
two 
four 
done 
➜ example: ✗ sh ./scripts.sh 
^C%➜ example: ✗ one 
three 
two 
four 

よく終了できますか?カーネルによって扱わデフォルト信号により

+0

目標は、すべてのバックグラウンドジョブまたは最後の4つのジョブを停止するのですか? – RomanPerekhrest

+0

ちょっと@RomanPerekhrest、目標はすべてのバックグラウンドジョブを停止することです。 – ThomasReggi

答えて

1

、しかし、私はkillを除くすべての信号は、プログラムで扱うことができると言って、参照を見てきました、我々は、例えば以下のようなトラップを使用して多くのため

finish(){ 
    < code to kill child process goes here > 
} 
trap finish EXIT 

sleep 1 && echo 'one' & 
sleep 2 && echo 'two' & 
sleep 1 && echo 'three'& 
sleep 2 && echo 'four' & 

wait 

CNTRL + C信号を取り込むことができ、 stackoverflowまたはredsymbol.net

0

@ JithinScarlaの助けを借りてこの他にstackoverflow post I made私はこれをまとめて、仕事をしているようです。

process_ids=() 

finish(){ 
    for i in "${process_ids[@]}"; do 
     kill -9 $i > /dev/null 2> /dev/null || : 
    done 
} 

append() { process_ids+=("$1"); }  # POSIX-standard function declaration syntax 

{ sleep 1 && echo 'one'; } & append $! 
{ sleep 5 && echo 'two'; } & append $! 
{ sleep 1 && echo 'three'; } & append $! 
{ sleep 5 && echo 'four'; } & append $! 

echo "Background processes:"    # Demonstrate that our array was populated 
printf ' - %s\n' "${process_ids[@]}" 

trap finish EXIT 

wait 

または、ここでもビットクリーナー:

function runParallel { 
    process_ids=() 
    finish(){ 
     for i in "${process_ids[@]}"; do 
      kill -9 $i > /dev/null 2> /dev/null || : 
     done 
    } 
    append() { process_ids+=("$1"); }  # POSIX-standard function declaration syntax 
    processes=("[email protected]") 
    for i in "${processes[@]}"; do 
     { eval $i; } & append $! 
    done 
    trap finish EXIT 
    wait 
} 

runParallel \ 
    "sleep 1 && echo 'one'" \ 
    "sleep 5 && echo 'two'" \ 
    "sleep 1 && echo 'three'" \ 
    "sleep 5 && echo 'four'" 
関連する問題