bash/gnome-terminal 的子程序不會終止 (CentOS/RHEL)

bash/gnome-terminal 的子程序不會終止 (CentOS/RHEL)

今天我觀察到一些事情,可能有一個簡單的解釋,但對我來說卻是非常出乎意料的:我正在運行 CentOS(以及行為相同的 RHEL)。我在終端機中開啟 bash 並啟動任何子進程,例如 gedit。窗戶打開了,很好。當我執行「ps」時,我可以看到 gedit 具有 bash 作為其父進程,而 bash 本身俱有 gnome-terminal 作為其父進程。當我停止 bash 時,我希望所有子進程也會停止。但是gedit繼續運行並且parent變成了1(init)!

我嘗試不優雅地停止 shell,而是用力殺死它,結果相同。它嘗試殺死終端而不是外殼,結果仍然相同。只有當我透過點擊 X 按鈕關閉終端時,gedit 也會關閉。

我沒想到會有這種行為。用 nohup 啟動 gedit,我不會感到驚訝,但即使沒有 nohup ...為什麼它還活著?

也許有人可以闡明一些情況並知道那裡發生了什麼。先致謝!

答案1

gedit、gvim、google-chrome 等程式會自動將自己分叉到後台。這允許您輸入

gedit /home/msw/ul-answer

映射新視窗並還原 shell 提示符。這不是一個糟糕的設計選擇,通常有一個選項可以覆蓋它。這些命令gedit -w不會gvim --nofork與控制終端分離,也不會傳回 shell 提示字元。

對於一個程式來說,它本身會在背景執行,它會分叉,然後父進程退出。這將使您的正常 gedit 實例在您鍵入後幾乎立即成為 init (PPID == 1) 的子級。

其他程式(例如 mplayer 或 calibre)不會自動進入後台,因為它們不經常鍵入,或者因為它們喜歡將偵錯資訊轉儲到控制終端。

增加了奇怪之處:

在花了一點時間測試並查看 strace 輸出等之後,gedit 似乎不會自動後台運行。我所說的關於 gvim 的內容仍然有效,而且現在已經過了睡覺的時間了,所以我現在就這樣吧。

答案2

當您關閉終端機視窗時,核心會發送一個嘆息發出猛擊信號。然後 Bash 向每個作業發送一個 SIGHUP,因此它會透過 SIGHUP 殺死 gedit。

當您透過鍵入exitCtrl+D或透過使用 SIGKILL 終止 bash 來退出 bash 時,終端模擬器會注意到其子進程已退出並關閉視窗。 Gedit 不受影響。

相關內容