SIGHUP 奇妙な行動

SIGHUP 奇妙な行動

コンテキスト:

bash&たとえば、リダイレクトなしでプロセスを実行しています./foo。プロセスが実行中ですwhile(1)。つまり、永遠に実行されます。また、プロセスSIGHUPの取得中にプロセスは無視されます。つまり、終了しません。

プロセスSIGHUPに送信すると、私のプロセスにも送信されます。その後、私のプロセスは信号を記録し、作業を続けます。bashSIGHUP

私の理解:

SIGHUP私は答えを通して理解を得ました。ここ。私の場合、bashプロセスは終了するのではなくブロックする必要があることを理解しています。

質問:

しかしそれは真実ではない。bashプロセスが継続すると、プロセスは終了します。しかし、今はbashプロセスではなく/lib/systemd/systemd --user新しい親になります。

環境およびその他の詳細:

Linux lap-0117 5.4.0-87-generic #98~18.04.1-Ubuntu SMP Wed Sep 22 10:45:04 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

ベストアンサー1

これは正常です。

SIGHUPは通常、制御端末が消えたときにシェルに送信されるため(つまり、これはUnixで数少ないリソース回収インタフェースの1つです)、端末のないシェルは意味がないため、シェルは終了します。

シェル自体はSIGHUPを処理し、シグナルハンドラはSIGHUPをすべてのバックグラウンドプロセスに渡し、制御端末が消えたことを通知します。基本ハンドラを出るすべてのプロセスはここで終了します。通常、これは端末を必要とするシェルコマンドです。

たとえば、このメカニズムはそれを使用してログファイルを表示し、ターミナルウィンドウを閉じるとクリーンアップされますtail -f。シェルとtailその中で実行されるコマンドは対話する端末がないため、役に立たなくなって終了します。

通常、「孤児」プロセスはPID 1にリンクされます。これは、PID 1がいつでもSIGCHLDを処理し、子プロセスの終了コードを収集できる唯一のプロセスであるためです。おそらくsystemdはここで興味深いことをしています。これをsystemdのユーザーインスタンスに接続することです。

おすすめ記事