9

バックグラウンドでいくつかの実行時間の長いプロセスを生成し、その後ハングアップするシェル スクリプトを作成したいと考えています。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を使用しています

4

4 に答える 4

13

これは私のために働く:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
于 2010-01-31T21:25:13.547 に答える
5

ジョーの答えは私を正しい軌道に乗せました。また、拠点をカバーするために、より多くの信号をトラップする必要があることもわかりました。

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

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait
于 2009-06-10T15:27:55.673 に答える
4

/bin/sh は Bash ではないと思われます (ただし、質問に「Bash」のタグを付けました)。

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

于 2009-06-10T15:26:03.307 に答える
1

このスクリプトは正しいように見え、期待どおりに機能します。

SIGTERM シグナルを「マスタープロセス」に送信するにはどうすればよいですか? kill -lサポートされているシグナルを確認するために実行する必要があるかもしれません。エラーメッセージが示すように、システムが認識していないように見える信号「10」を送信します。

次回は、オペレーティング システム、シェル バージョン、カーネルなどを追加する必要があります。

于 2009-06-10T15:17:07.333 に答える