Terminal

從 GNOME 終端執行父程序時,孤立程序的父 ID 不為 1

  • April 3, 2015

我從 GNOME 終端啟動了一個新程序,然後這個程序派生了一個子程序。但是當我殺死父程序時,孤立程序的父 id 變成了代表init --userpid 的 1 以外的東西。

當我在虛擬終端中執行此操作時,父 pid 為 1,代表init程序。

如何從 GNOME 終端執行新程序,以便當它死亡時,子程序的父 pid 變為 1 而不是程序的 pid init --user

非常感謝。

幾個月前我已經回答了一個類似的問題。因此,請先查看技術細節。在這裡,我將向您展示該答案如何涵蓋您的情況。

正如我所解釋的,我和其他各種守護程序監控實用程序的作者利用了 Linux現在的工作方式,而您所看到的正是這種情況,幾乎與我所闡述的完全一樣。

唯一缺少的資訊是init --user您的新貴會話實例。它在您首次登錄會話時啟動,並在您註銷時停止。它可以讓您擁有自己的每個會話作業(與 MacOS 10下的使用者代理launchd類似但不完全相同)。

幾年前,Ubuntu 人員著手將圖形桌面系統轉換為使用新貴的每會話作業。您的 GNOME 終端正在作為每個會話作業啟動,並且任何孤兒都由最近的子收割者繼承,這當然是您的每個會話實例的暴發戶。

近幾個月來,systemd 人員一直在做同樣的事情,將 GNOME 終端設置為從每個使用者的 systemd 實例執行各個選項卡作為單獨的 systemd 服務。(您可以說您的問題是關於新貴,而不是 systemd,因為在 systemd 系統上,子收割者程序將是systemd --user.)

如何從 GNOME 終端執行新程序,以便子程序的父 PID 變為 1,而不是 ubuntu 會話初始化程序的 PID?

這是故意很難的。服務經理想要跟踪孤立的子程序。他們不想失去他們來處理#1。所以快速的概要是:停止嘗試這樣做。

如果您只是因為您認為您的程序應該有一個父程序 ID 為 1 而詢問,那麼請放棄這個想法。

如果您錯誤地認為這是作為守護程序的一個方面,那麼請注意,自從 IBM 的 System Resource 之類的東西出現以來,父程序 ID 為 1 的守護程序並沒有得到保證(在某些 Unices 上,整個系統並非如此) 1990 年代控制器和 Bernstein 的守護程序工具。在任何情況下,通過在登錄會話中進行雙重分叉都不會成為守護程序。這是一個早就知道是半生不熟的想法。

如果您錯誤地認為這是孤立子程序的不言而喻,請再次閱讀我之前的答案。孤兒被重新撫養以處理#1 的絕對主義是錯誤的,並且在撰寫本文時已經錯了三年多。

如果您有一個子程序由於某種奇怪的原因確實需要這個,那麼找出那個奇怪的原因並修復它。這可能是一個錯誤,或者有人做出了無效的設計假設。不管是什麼原因,守護程序管理的世界在 1990 年代發生了變化,而 Linux 在幾年前也發生了一些變化。現在是趕上的時候了。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/194182