今日、私は簡単な説明があるかもしれませんが、私には非常に予想外のものを観察しました。私はCentOS(そして同じように動作するRHEL)を実行しています。ターミナルでbashを開き、geditなどの子プロセスを起動します。窓が開いていて大丈夫です。 "ps"を実行すると、geditにbashが親プロセスであり、bash自体にgnome-terminalが親プロセスであることがわかります。 Bashを停止すると、すべての子プロセスも停止したいと思います。しかし、geditは引き続き実行され、親は1(init)になります!
私はシェルを優雅に止めずに強制的に殺そうとしましたが、同じ結果を得ました。シェルの代わりに端末を終了しようとしましたが、それでも同じ結果が得られました。 Xボタンをクリックして端末を閉じると、geditも閉じます。
私はこのような行動を期待していませんでした。 nohupでgeditを起動しても驚かないでしょう。しかし、nohupがなくても…なぜまだ生きていますか?
たぶん、誰かが状況についていくつかの情報を提供し、そこで何が起こっているのかを知ることができます。よろしくお願いします!
答え1
gedit、gvim、google-chromeなどのプログラムは自動的にバックグラウンドでフォークされます。これにより、次のように入力できます。
gedit /home/msw/ul-answer
新しいウィンドウをマップし、シェルプロンプトを復元します。これは悪いデザインの選択ではなく、通常これを上書きするオプションがあります。これらのコマンドは制御端末から切り離されgedit -w
たりgvim --nofork
、シェルプロンプトに戻ることはありません。
プログラムをバックグラウンドで実行するには、分岐してから親プロセスを終了します。これにより、入力した直後に通常のgeditインスタンスがinit(PPID == 1)の子インスタンスになります。
他のプログラム(mplayerやキャリバーなど)は頻繁に入力しないか、デバッグ情報を制御端末にダンプするのが好きなので、自動的にバックグラウンドに切り替えられません。
奇妙さを加えた:
少し時間をテストし、strace出力などを見た後、geditはバックグラウンドで自動的に実行されないようです。私がgvimについて言ったことはまだ有効であり、就寝時間も経過したので、今はそのままにします。
答え2
端末ウィンドウを閉じると、カーネルは以下を送信します。ため息をつくスラム信号を送ってください。その後、Bash は各ジョブに SIGHUP を送信するため、SIGHUP で gedit を終了します。
exit
またはCtrl+を入力するか、SIGKILLでDbashを終了してbashを終了すると、端末エミュレータは子プロセスが終了したことを認識してウィンドウを閉じます。 Geditは影響を受けません。