親プロセス(ターミナル)を閉じても、特定の子プロセスは閉じません。

親プロセス(ターミナル)を閉じても、特定の子プロセスは閉じません。

私はLinuxに初めて触れていましたが、これまで学んだのは、gnome端末を介して新しいプロセスを開くと(例えば、gedit &「&バックグラウンドで実行」)、端末を閉じるとgeditも終了することです。だからこれを防ぐためにこのプロセスを拒否する親端末でgeditのプロセスIDを提供します。

しかし、私は特徴を見つけました。これで、gnome-terminal(parent)でgnome-terminalを開くと、gnome-terminal &親端末を閉じると、子端末を拒否しなくても子端末が閉じられません。

なぜ?異常が存在する場合、何が異常を作りますか?この例外を参照する設定ファイルはどこにあります(アクセス可能な場合)。

答え1

GNOMEターミナルウィンドウを閉じると、シェルプロセス(またはターミナルに実行するように指示したすべてのコマンドのプロセス)はSIGHUP信号を受け取ります。プロセスは次のことができます。捕まえる指定された関数が呼び出されたことを意味するSIGHUPは、ほとんどのシェルで捕捉されます。 Bashはすべてのバックグラウンドプロセス(拒否されたプロセスを除く)にSIGHUPを送信してSIGHUPに応答します。

例の表示(geditおよびの助けを借りて):GNOMEターミナルウィンドウが閉じると、geditはシェルからSIGHUPを送信してSIGHUPをキャプチャしないため(無視しない)、geditはすぐに終了します。 。pstreestrace

─gnome-terminal(31486)─bash(31494)─gedit(31530)

[31486] getpgid(0x7b06) = 31494
[31486] kill(-31494, SIGHUP) = 0
[31494] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31486, si_uid=0} ---
[31494] kill(-31530, SIGHUP) = 0
[31530] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31494, si_uid=0} ---
[31530] +++ SIGHUPで死亡+++
[31494] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31530, si_status=SIGHUP} ---
[31486] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31494, si_status=SIGHUP} ---

gnome-terminalただし、コマンドを入力して既存のGNOMEターミナルウィンドウがある場合、デフォルトではGNOMEターミナルは珍しい操作を実行します。org.gnome.Terminal.FactoryD-Bus経由でファクトリを呼び出した後、シェルに表示されるバックグラウンドジョブはすぐに終了します。第二。

そのファクトリ呼び出しの結果として入力後に表示される新しいウィンドウは、新しいgnome-terminalスレッドによって管理されます。同じGNOME端末プロセス既存のウィンドウを管理することです。最初のシェルは2番目のシェルのプロセスIDを知らず、自動的に終了することはできません。

─GNOME端末(9063)─┬─bash(39548)
  │ └─bash(39651)
  ├─{GNOME Terminal}(9068)
  └─{GNOME Terminal}(9070)

一方、 と入力するとgnome-terminal --disable-factory &ファクトリは呼び出されず、プロセスの面geditでは例のように動作します。

──gnome-terminal(39817)──bash(39825)──gnome-terminal(39867)──bash(39874)
  │ =─{GNOME Terminal}(39868)
  └─{GNOME Terminal}(39819)
最初の端末ウィンドウを閉じると、最初の端末ウィンドウと2番目の端末ウィンドウの両方が閉じます。

答え2

ここではXfceを実行していますが、Gnome Terminalにも同じ状況が適用されることがあります。

2つのecho $$端末ウィンドウで[edit:then run]を実行するとps faux一つ xfce4-terminalこれはプロセスですが、bash同じ親を持つ2つの異なるプロセス、つまりxfce4-terminalプロセス自体です。実際、1つの端末プロセスだけが複数のウィンドウを表示します。ウィンドウが必ずしもプロセスを意味するわけではありません。ps faux直接走って確認してみてください。

関連情報