次の 2 つの bash スクリプトがあるとします。
/tmp/トラッパー:
#!/bin/bash
trap 'echo trapper: ignoring USR1' USR1
"$(dirname $0)"/usr1er & p=$!
sleep 1
echo trapper: now killing usr1er
kill $p
echo trapper: sleeping
sleep 1
echo trapper: reached end of trapper
/tmp/usr1er:
#!/bin/bash
trap 'echo "usr1er: EXIT received, sending USR1"; kill -USR1 0' EXIT
while sleep 1;do echo usr1er: sleeping;done
trapper は USR1 をトラップし、単純に無視することになっています。usr1er を起動し、USR1 シグナルでそのプロセス グループを強制終了します。ここで、インタラクティブ シェルからスクリプトとして trapper を起動すると、usr1er が強制終了され、正常に終了します。
$ /tmp/trapper; echo done
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
/tmp/trapper: line 9: 16596 Terminated "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper
done
試してみると$(/tmp/trapper)
、シェル全体が終了します。同様に、次のように を呼び出す別のスクリプトを作成すると、次/tmp/trapper
のようになり/tmp/outer
ます。
#!/bin/bash
"$(dirname $0)"/trapper
echo outer: reached end of outer
「到達した外側の終わり」を出力せずに強制終了されます。
$ /tmp/outer
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
/tmp/trapper: line 9: 23544 Terminated "$(dirname $0)"/usr1er
User defined signal 1
trapper: ignoring USR1
trapper: reached end of trapper
なんで?