私は次の問題でAskUbuntuユーザーを助けようとしています。
コンテキスト:-
私はbashでプロセスを実行しています。
&
つまり、バックグラウンドモードで接続しています。プロセスには1つありますwhile(1)
。つまり、永遠に実行されます。私のbashは親プロセスで、私のプロセスは子プロセスです。親プロセスが終了したときにカーネルが子プロセスを処理する方法を理解したいと思います。観察結果:-
- ターミナルを終了すると(
exit
ターミナルコマンドを使用して)、子プロセス/lib/systemd/systemd --user
の親プロセスになります。kill
他の端末で端末プロセスを終了すると、結果は上記と同じです。- 十字アイコンを使用して端末を閉じると、子プロセスも終了します。
質問:-
終了と終了/終了の違いは何ですか?
私は答えを書きましたが、何が起こっているのかよく理解していないようですが、UnixとLinuxで役立つ何人かの人々が私よりもよく知っていて何が起こっているのかを説明できると思います。
したがって、AskUbuntuで試したのではなく、回答をリンクして作成して理解するのに役立ちます。
答え1
1に対する答えは、子を生成する前に呼び出して「子死神」になるので孤児systemd --user
(つまり、pid 1 = initの役割を果たす)を取ることです。prctl(PR_SET_CHILD_SUBREAPER, 1)
これはLinux拡張です。
3の答えは、ターミナルエミュレータによって異なります。彼らは同じように動作しません。
しかし、一般的に1,2,3の違いは後者の場合です。強く打つ信号[1]を受信しSIGHUP
、それをサブプロセスに戻してバックグラウンドプロセスを終了します。
シェル[つまり、bash]は
SIGHUP
終了する前に 。インタラクティブSIGHUP
シェルは、実行中または停止したすべてのジョブに再送信されます。停止したジョブを送信して受信したことをSIGCONT
確認してくださいSIGHUP
。
これはバッシュ拡張;すべてのシェルがSIGHUP
信号を再送信するわけではありません。特にダッシュ(/bin/sh
Ubuntuの場合)はそのようなことをしません。
SIGHUP
ただし、ケース1の場合でも、バックグラウンドプロセスのプロセスグループで停止したプロセスがある場合(シミュレートされた端末エミュレータを使用script
)、信号を取得できます。
$ script -q /dev/null -c /bin/bash
$ sh -c 'sleep 1 & kill -STOP $!; echo $$; while sleep 1; do :; done' &
[1] 3317
$ 3317
$ exit
exit
$ ps 3317
PID TTY STAT TIME COMMAND
# 3317 is dead.
これ停止(いいえ眠る)sleep
プロセスが親プロセスを削除しました。この部分を引くとsleep 1 & kill -STOP $!
生きていきます。
以前の機能とは異なり、これはオペレーティングシステムの標準機能であり、bashまたは他のシェルに固有のものではありません。
SIGHUP
[1] bashはフォアグラウンドプロセスグループにあり、ターミナルエミュレータが疑似ターミナルを破壊したか(カーネルがそれを送信するようにするSIGHUP
)、明示的にそれ自身を送信したためにシグナルを受け取りますSIGHUP
。
答え2
子プロセスには常に親プロセスが必要です。すべてのプロセスには親プロセスPIDがあります。
最初の2つの場合は親プロセスを終了するため、プロセスに無効な親IDがあります。 Unix(およびPosix)では、init
これらのプロセスが採用され(最近一般的にシステム化されているPID 1を使用するプロセス)、これらのプロセスはシグナルを受け取ります(したがって、新しいサブプロセスを採用する必要があることがわかります。 )。これはまたinit
(したがってsystemdが重要な理由です。重要なプロセスが終了したか孤立したかどうかを確認し、対処することができます)。
3番目のケースはさらに興味深いです。注:この場合、ターミナルを終了せずにターミナルにシャットダウンするように指示すると、ターミナルはそのエントリをクリーンアップする時間があります。
現在、異なるタイプのプロセス、制御グループ、およびジョブ制御があります。複雑なトピック:ターミナルはターミナル部分(入力処理と文字の描画方法)を停止しますが、ターミナル(最近は通常Pasudoターミナル、確かにxの疑似ターミナル)はこれらのプロセスにもう一方のSIGHUP
端がハングするように送信します。戻る。通常、これはその制御グループのすべてのプロセスを終了するのと同じです。プログラムは端末にシグナルを無視するか、またはより良いシャットダウンのためにそのシグナルを処理するように指示できます(通常は画面をリセットすることによって)。 ( nohup
SIGHUP シグナルが発生した場合、プロセスを継続して実行するためにユーティリティを使用できます.)
したがって、違いは次のとおりです。 1と2はSIGHUPを子プロセスに送信できない親プロセスを終了するため、PID 1はそれを処理します(注:利用できない場合はstdinとstdoutを終了できますが、これは親プロセスによって異なります)。プロセス)。 3 端末はうまく終了し、相手が電話を切ったので、スムーズに処理しなければならないことを子供に知らせます。