0

特定の数のプロセスを実行するための単純な bash スクリプトがあります。

#!/bin/bash
# usage: ./run-abt.sh <agent count> <responder port> <publisher port>
echo "./abt-monitor 127.0.0.1 $2 $3 $1"
exec ./abt-monitor 127.0.0.1 $2 $3 $1 &
for (( i=1; i<=$1; i++ ))
do
    echo "Running agent $i";
    exec ./abt-agent 127.0.0.1 $2 $3 $i $1 > $i.txt &
done

追加する必要があるのは、ユーザーが押しCtrl+Cてコントロールを bash に戻したとき、すべてのプロセスrun-abt.shが kill によって作成されたことです。

4

2 に答える 2

4

次の行をスクリプトの先頭に追加します。

trap 'kill $(jobs -p)' EXIT

スクリプトが Control-C からの割り込みシグナル (またはその他のシグナル) を受け取ると、スクリプトは終了する前にすべての子プロセスを終了します。

スクリプトの最後に への呼び出しを追加してwait、バックグラウンド プロセスが完了する前にスクリプト自体が自然に終了するようにします。これにより、上記でインストールしたシグナル ハンドラーが実行される可能性があります。あれは、

for (( i=1; i<=$1; i++ ))
do
    echo "Running agent $i";
    exec ./abt-agent 127.0.0.1 $2 $3 $i $1 > $i.txt &
done    
# There could be more code here. But just before the script would exit naturally,...
wait         
于 2013-06-22T23:07:22.470 に答える
2

trap組み込みを使用します。

trap handler_func SIGINT

ただし、子プロセスの pid を個別に保存および管理する必要があります。

于 2013-06-22T21:04:30.783 に答える