新しい端末を開き、次のコマンドを入力しますfirefox&
。ps -l
4 R 1000 23132 23104 99 80 0 - 2177945 - pts/27 00:00:07 firefox
コマンドを使用してシェルを閉じると、exit
Firefoxサブプロセスは開いたままになります。
いつもこれでしたか? Firefoxも閉じる必要はありませんか?最近のカーネルに新しいものがあるか、私が逃したものがありますか?
結果ps -el|grep firefox
は次のようになります。
4 S 1000 23132 1 14 80 0 - 2233312 poll_s ? 00:00:21 firefox
PPIDが1に変更されました。
PPIDが1になる原因は何ですか?
編集:ああ、ちょうどターミナルを閉じるとシェルを閉じる結果が非常に異なることに気づきました。ターミナルを閉じると、すべての子プロセスが閉じますが、シャットダウンコマンドでシェルを閉じると閉じられません...理由はわかりません。 (ターミナルを閉じるとSIGTERMはすべての子プロセスに転送されますか?しかし、シェルを閉じると孤立プロセスが残りますか?)
答え1
最近のカーネルに新しいものがあるか、私が逃したものがありますか?
いいえ、プロセスが終了すると、その子プロセスは引き続き実行され、その親プロセスはinit
(PID 1)に変わります。あるいは、Linuxで「サブリッパー」を見つけるなど、他のシステム依存プロセスもあります。
これは常にそうであり、これは親プロセスを2回フォークし、呼び出して終了し、デーモンに移行するプロセスのnohup
効率的な作業と不良を可能にします。setsid()
ターミナルセッションを閉じると、SIGHUP
残りのプロセスに送信できますが、これを無視してもかまいません(これは完了ですnohup
)。またsystemd
、ターミナルログインセッションの終了時に遅延プロセスを終了するように設定できますが、firefox
ターミナルエミュレータのXで実行されている可能性があるため、これは適用されません。