2013-03-21 14 views
7

私は次のように私はシェルスクリプトから一括して起動するカップルのPythonスクリプトを持っている:ctrl + Cでシェルスクリプトによって開かれたすべてのプロセスを強制終了するには?

#!/bin/bash 
python prog1.py & 
python prog2.py & 
python prog3.py 

私は、多くの場合、これらのプロセスを停止したい開発していますので。私は通常、Ctrl + Cを押すことでそうしますが、残念なことに、いくつかのPythonプログラムは(ゼロ)ソケットを開いています。これは私が手動でそれらを見つける必要があることを意味します(私はlsof -iを使用します)、PIDを使用してそれらを削除します。

私はctrl + Cを押すとシェルからこれらのpythonプロセスを自動的に削除する簡単な方法を探しています。 another thread here on Stackoverflowに私は必要と思われるコードをいくつか見つけました。私はコードについて何も理解していないし、どのように私のニーズにそれを調整することができます。

ここで私を助けてくれる人は誰ですか?

cat >work.py <<'EOF' 
import sys, time, signal 
signal.signal(signal.SIGINT, signal.SIG_DFL) 
for i in range(10): 
    time.sleep(1) 
    print "Tick from", sys.argv[1] 
EOF 
chmod +x work.py 

function process { 
    python ./work.py $1 
} 

process one & 
wait $! 
echo "All done!" 

答えて

11

はbashスクリプトキャッチSIGINTをしましょう、そしてそれは、現在のプロセスグループのすべてを殺すあります

intexit() { 
    # Kill all subprocesses (all processes in the current process group) 
    kill -HUP -$$ 
} 

hupexit() { 
    # HUP'd (probably by intexit) 
    echo 
    echo "Interrupted" 
    exit 
} 

trap hupexit HUP 
trap intexit INT 

python prog1.py & 
python prog2.py & 
python prog3.py & 

wait 
+0

+1素敵な、私は、ジョブ制御と、この同じスクリプトを作成しようとかなり失望しましたbashは複数のジョブを指定する方法を提供しません。 'kill%?python'は理にかなっていました。 – kojiro

+0

それは素晴らしいです!どうもありがとう!ちょうど質問。私はあなたのコードを以下のコードに最小化しました。これは同じように動作するようです。残りの部分は何ですか? #!/ bin/bash intexit(){kill -HUP - $$;出口; } trap intexit INT python prog2.py& python prog2.py& python prog3.py – kramer65

+0

'hupexit'は素敵なメッセージを表示し、' wait'はコードがより一様に見えるようにしています。背景と待ち)。 – nneonneo

関連する問題