
背景:
- 透過 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
,因此它可以繼承環境。此後一切都取決於伺服器。只要伺服器執行,就不會從任何後續客戶端直接繼承,因為伺服器和新產生的進程(窗格)都不是該客戶端的後代。看我的這個答案。