為什麼 Ubuntu 上 tmux 的 PPID 是 1?

為什麼 Ubuntu 上 tmux 的 PPID 是 1?

背景:

  • 透過 ssh 連接到 Ubuntu 伺服器
  • 運行 tmux 並分離

為什麼tmux的PPID是1?有關於 tmux 運行時機制的資訊嗎?

答案1

tmux在客戶端-伺服器架構中運行。每當您tmux從 shell 執行時,您都會執行作為 shell 子級的用戶端。 (可以tmux從非 shell 運行,例如直接從 運行sshd,此細節不會改變任何內容)。

tmux客戶端嘗試尋找tmux與您的使用者關聯的伺服器。如果找不到伺服器,有時客戶端會抱怨(例如tmux attach-session),有時它會啟動伺服器(例如sole tmux,相當於tmux new-session)然後完成它的工作。

任何客戶端的工作tmux都是與伺服器通訊並讓伺服器執行某些操作。

tmux需要啟動伺服器時,它會clone(2)自行啟動。產生的子進程立即clone再次運行,然後退出。最新的進程成為實際的tmux伺服器並且它的 PPID 為 1,因為它的父級已死亡。看起來中間進程的唯一工作就是將伺服器與其祖先「分離」。

我認為它可能適用於tmux作為某個客戶端的直接子級的伺服器tmux,然後僅在客戶端死亡後才獲得 PPID 1。請注意,重點tmux是讓伺服器在原始客戶端分開後繼續運作;因此,如果伺服器是某個客戶端的子級,那麼它很可能遲早會被孤立。而且因為一般來說tmux客戶端可以從任何 shell 或另一個進程運行,這些進程可能會嘗試監視其子進程、向它們發送訊號等,因此盡快孤立伺服器是合理的做法。

因此伺服器幾乎立即獲得 PPID 為 1。您執行的每個 shell 或另一個進程tmux都是伺服器的後代。 (重新)連線後,您將看到用戶端向您顯示的內容。客戶端本身是您在其中呼叫它的 shell(或sshd其他)的子級。它與伺服器通信,將擊鍵傳遞給伺服器,接收有關視窗外觀的資訊並相應地列印字元。

伺服器一旦啟動,就會一直運行,直到其中的所有會話都被終止。這意味著為了正常終止它,您需要終止作為窗格的所有 shell(或其他進程)。

這種架構解釋了為什麼第一次呼叫的環境tmux可以被保留,但通常tmux客戶端的環境可能並不重要。伺服器作為第一個伺服器的孫子啟動tmux,因此它可以繼承環境。此後一切都取決於伺服器。只要伺服器執行,就不會從任何後續客戶端直接繼承,因為伺服器和新產生的進程(窗格)都不是該客戶端的後代。看我的這個答案

相關內容