コンテキスト:
bash
&
たとえば、リダイレクトなしでプロセスを実行しています./foo
。プロセスが実行中ですwhile(1)
。つまり、永遠に実行されます。また、プロセスSIGHUP
の取得中にプロセスは無視されます。つまり、終了しません。
プロセスSIGHUP
に送信すると、私のプロセスにも送信されます。その後、私のプロセスは信号を記録し、作業を続けます。bash
SIGHUP
私の理解:
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のユーザーインスタンスに接続することです。