ターミナルウィンドウを閉じるのと終了/終了するのはどう違いますか?

ターミナルウィンドウを閉じるのと終了/終了するのはどう違いますか?

私は次の問題でAskUbuntuユーザーを助けようとしています。

端末を終了して閉じます。

コンテキスト:-

私はbashでプロセスを実行しています。&つまり、バックグラウンドモードで接続しています。プロセスには1つありますwhile(1)。つまり、永遠に実行されます。私のbashは親プロセスで、私のプロセスは子プロセスです。親プロセスが終了したときにカーネルが子プロセスを処理する方法を理解したいと思います。

観察結果:-

  1. ターミナルを終了すると(exitターミナルコマンドを使用して)、子プロセス/lib/systemd/systemd --userの親プロセスになります。
  2. kill他の端末で端末プロセスを終了すると、結果は上記と同じです。
  3. 十字アイコンを使用して端末を閉じると、子プロセスも終了します。

質問:-

終了と終了/終了の違いは何ですか?

私は答えを書きましたが、何が起こっているのかよく理解していないようですが、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/shUbuntuの場合)はそのようなことをしません。


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

おすすめ記事