Bashマニュアルから
Bashがコマンドの完了を待機していて、トラップが設定されているシグナルを受信した場合、コマンドが完了するまでトラップは実行されません。
Bashがwaitビルトインを介して非同期コマンドを待機している場合、トラップが設定されているシグナルを受信すると、待機ビルトインは終了ステータスが128を超えてすぐに戻り、その直後にトラップが実行されます。
私は最初の文のためにいくつかの実験を作成しました。
Lxterminalのタブで実行されているシェルの場合:
$ trap "echo hello" HUP
$ sleep 100
次に、「x」アイコンをクリックしてタブウィンドウを閉じ、SIGHUPをシェルに送信します。
シェルは、sleep 100
が完了するのを待ってからトラップを実行するのではなく、すぐに終了します。なんでだろう?私は何か見落としてますか?
これは動作します
$ trap -p
trap -- 'echo hello' SIGHUP
$ echo $$
19708
$ sleep 100
次に、lxterminalの別のタブから実行します。
$ kill -HUP 19708
$
最初のタブのsleepコマンドが完了すると:
$ sleep 100
hello
ありがとう。
最初の例では、「x」アイコンをクリックしてターミナルエミュレータウィンドウを閉じると、SIGHUPがシェルである制御端末に送信されます。
ターミナルエミュレータウィンドウは閉じられますが、シェルは終了せず、sleep 100
が完了するまで、sleep 100
は実行され続けます。その後、シェルはSIGHUPトラップを実行します。 ps
の出力からはわかりますが、すでに閉じられているターミナルエミュレータウィンドウからはわかりません。