2009-06-10 42 views
6

長時間実行されているいくつかのプロセスをバックグラウンドで生成し、その後ハングアップするシェルスクリプトを作成します。 SIGTERMを受け取ると、私はすべてのサブプロセスも終了させたい。シェルスクリプトがプロセスを起動し、SIGTERMで子プロセスを終了する

基本的には、「マスタープロセス」が必要です。

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait 

上記のスクリプトは、trap: 10: SIGTERM: bad trapで失敗します。ここでは

は、私がこれまでに得たものです。

編集:私はこのスクリプトが正しく見え、期待通りに私の作品のUbuntu 9.04

答えて

5

ジョーの答えが私を正しい軌道に乗せる。 私は自分のベースをカバーするためにもっと多くの信号を捕らえなければならないことも知った。

最終スクリプトは次のようになります。

#!/bin/sh 

sleep 600 & 
PID1="$!" 

sleep 600 & 
PID2="$!" 

trap "kill $PID1 $PID2" exit INT TERM 

wait 
+1

シグナル番号を使用する必要があると思われる場合は、標準化されたものだけを使用してください。しかし、私はあなたのシステムの信号名を使うのが一番です。 – TheBonsai

+0

あなたはそうです。私はこれが最後のバージョンであることを願っています... – itsadok

+0

あなたのコードは、あなたが望む数多くのバージョンを持つことができます;-) – TheBonsai

1

を使用しています。

どのようにSIGTERM信号を「マスタープロセス」に送信しますか? kill -lを実行して、どの信号がサポートされているかを確認してください。 エラーメッセージには、システムが認識していないと思われる信号「10」が送信されることが示唆されています。

そして次回は、このような質問のためのオペレーティングシステム、シェルバージョン、カーネル、...を追加する必要があります

+0

お返事ありがとうございました。私はUbuntu 9.04を使用していますが、これはおそらくbash対ダッシュの問題であると私は理解しました。最初の行を#!/ bin/bashに変更すると広告されたように動作します – itsadok

4

私はあなたが「バッシュ」などの質問にタグ付けされたにもかかわらず、あなたの/ binに/ shのは(バッシュではありません疑います)。

メッセージからは、DASHだと思います。バッシュコードを書く必要がある場合は、マニュアルを確認するか、シバンを修正してください。

10

これは私の作品:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT 
  • kill -- -$$は、このようにも子孫を殺し、全体のプロセスグループにSIGTERMを送信します。

  • 信号EXITを指定すると、set -e(詳細はhere)を使用すると便利です。

+0

pid 0は何を意味していますか?文字通り、またはプレースホルダーとしての「...」を意味しますか? – itsadok

+0

どういうわけか、これは私が 'kill - -$$'の代わりに 'kill-0'を使ったときにのみ役に立ちました。後者は何らかの理由で '11641:プロセスが見つかりません 'と言っていました。 – WorldSEnder

関連する問題