13

私のサンプルファイル

トラップテスト.sh:

#!/bin/bash
trap 'echo trapped' TERM
while :
do
  sleep 1000
done

$ traptest.sh &

[1] 4280

$ kill %1 <-- ジョブ番号による kill が機能します

終了しました

閉じ込められた

$ traptest.sh &

[1] 4280

$ kill 4280 <-- プロセス ID による kill が機能しない?

(コオロギの音、プロセスは強制終了されません)

trap ステートメントを完全に削除すると、kill process-id が再び機能しますか?

仕事でいくつかの RHEL 2.6.18-194.11.4.el5 を実行しています。私はこの振る舞いに本当に困惑しています。それは正しいですか?

4

3 に答える 3

9
kill [pid]

指定された PID に排他的に TERM シグナルを送信します。

kill %1

TERM シグナルをジョブ #1 のプロセス グループ全体、この場合はスクリプト pid + 彼の子 (sleep) に送信します。

スリーププロセスとスクリプトプロセスでstraceを使用して確認しました

とにかく、誰かがここで同様の問題を抱えています (ただし、SIGTERM ではなく SIGINT を使用): http://www.vidarholen.net/contents/blog/?p=34

最も重要な文を引用します。

kill -INT %1 は、シグナルをバックグラウンドの pid ではなく、ジョブのプロセス グループに送信します!

于 2013-01-07T14:55:53.260 に答える
8

これは予期される動作です。によって送信されるデフォルトのシグナルkillSIGTERM、トラップによってキャッチされている です。このことを考慮:

#!/bin/bash
# traptest.sh

trap "echo Booh!" SIGINT SIGTERM
echo "pid is $$"

while :                 # This is the same as "while true".
do
    a=1
done

(スリープは実際に新しいプロセスを作成し、私の例では動作がより明確になっていると思います)。

したがって、traptest.shある端末で実行しkill TRAPTEST_PROCESS_ID、別の端末から実行すると、traptest を実行している端末の出力はBooh!期待どおりになります (プロセスは強制終了されません)。を送信しようとするkill -s HUP TRAPTEST_PROCESS_IDと、traptest プロセスが強制終了されます。

これ%1で混乱は解消されるはずです。

注: コード例はtldpから取得されます

于 2013-01-07T14:51:44.223 に答える