私は次の問題で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
。