web-dev-qa-db-ja.com

コマンドが完了するのを待って、トラップが設定されているSIGHUPを受信すると、bashがすぐに終了するのはなぜですか?

Bashマニュアルから

Bashがコマンドの完了を待機していて、トラップが設定されているシグナルを受信した場合、コマンドが完了するまでトラップは実行されません。

Bashがwaitビルトインを介して非同期コマンドを待機している場合、トラップが設定されているシグナルを受信すると、待機ビルトインは終了ステータスが128を超えてすぐに戻り、その直後にトラップが実行されます。

私は最初の文のためにいくつかの実験を作成しました。

  1. Lxterminalのタブで実行されているシェルの場合:

    $ trap "echo hello" HUP
    $ sleep 100
    

    次に、「x」アイコンをクリックしてタブウィンドウを閉じ、SIGHUPをシェルに送信します。

    シェルは、sleep 100が完了するのを待ってからトラップを実行するのではなく、すぐに終了します。なんでだろう?私は何か見落としてますか?

  2. これは動作します

    $ trap -p
    trap -- 'echo hello' SIGHUP
    $ echo $$
    19708
    $ sleep 100
    

    次に、lxterminalの別のタブから実行します。

    $ kill -HUP 19708
    $
    

    最初のタブのsleepコマンドが完了すると:

    $ sleep 100
    hello
    

ありがとう。

関連 ターミナルでctrl-cと入力すると、フォアグラウンドジョブが完了するまで終了しないのはなぜですか?

1
Tim

最初の例では、「x」アイコンをクリックしてターミナルエミュレータウィンドウを閉じると、SIGHUPがシェルである制御端末に送信されます。

ターミナルエミュレータウィンドウは閉じられますが、シェルは終了せず、sleep 100が完了するまで、sleep 100は実行され続けます。その後、シェルはSIGHUPトラップを実行します。 psの出力からはわかりますが、すでに閉じられているターミナルエミュレータウィンドウからはわかりません。

0
Tim