我目前正在使用 SSH 客戶端連接我的實驗室正在使用的伺服器。我對「後台運行的會話」的概念有疑問。我查看了這個社區的一個問題(什麼是後台進程?)但我覺得這與我想知道的有點不同。
我們正在使用的伺服器(我不確定是伺服器還是網路連線)遇到了一些問題,例如當我們讓進程運行過夜並在早上來時,shell 會話會中斷連線。
有人建議的解決方案是使用該程序多路復用器來規避這個問題。該程式聲稱要做的是分離會話,這樣即使伺服器斷開連接,我們的進程也不會受到干擾。
我只是想知道,像這樣的「在後台運行」的進程究竟意味著什麼?這與我上面鏈接的問題相同嗎?另外,「附加或分離」會話是什麼意思?
我想我的困惑來自於我不明白當 shell 斷開連接時會話如何運作。
謝謝!
答案1
你對這個概念有困難,因為不存在這樣的概念。 行程群組可以在後台/前台。該概念不適用於會議,既不是作業系統所謂的會話,也不是所謂的tmux
會話,這是兩個截然不同的東西。
所做tmux
的就是創建一個或多個偽終端,其中運行的程式tmux
將其視為控制終端(以及標準輸入、輸出和錯誤)。它多路復用這些內部端子到一個單一的外終端,這將是當您透過 SSH 登入時,SSH 伺服器在您的電腦上設定的偽終端。
有兩個tmux
進程,一個是長壽命的伺服器連接到所有這些內部偽終端的後端(即“主”側,使用不再流行的術語),以及客戶它是該伺服器和所實現的外部終端之間的中介。實際上,可以有多個客戶端,但我們可以在這裡掩蓋這種複雜性,因為它不會改變重點。
這伺服器只要至少有一個內部偽終端剩餘,進程就存在。它將偽終端分組為集合,這就是所謂tmux
的會議。不要將其與作業系統所稱的會話(進程組和可選的控制終端的集合)或會話混淆。會議透過 SSH(遠端 SSH 伺服器和本機 SSH 用戶端之間)。 「會話」可以表示很多不同的事物。請注意,我tmux
在這裡用“”、“SSH”和“作業系統”對其進行了不同的限定。
這客戶過程是短暫的,然後就會消失——分離來自tmux
會話和伺服器 — SSH 連線遺失。當您使用 SSH 重新登入時,您將建立一個新的客戶認為重新連接到tmux
伺服器(由其管理的會話),並且新客戶端實現伺服器的使用者介面tmux
- 所有視窗在tmux
會話和狀態列中 — 進入新的偽終端以進行新的 SSH 登入工作階段。客戶端tmux
一次實作一個會話,即它目前所連接的會話。
客戶端進程是作業系統所謂會話的一部分,該會話由作業系統控制外由 SSH 伺服器建立的用於 SSH 登入的偽終端。它受作業系統會話的生命週期影響,而作業系統會話的生命週期又受 SSH 會話的生命週期影響,並且可以位於後台或前台進程組中該外部航廈的。它(因此)受到shell作業控制該 SSH 會話的登入 shell 的名稱。
伺服器進程完全脫離外部終端機及其作業系統會話。它不受他們的壽命限制。這是不在他們的後台或前台進程組。它的壽命完全取決於內終端,其 I/O 為tmux
客戶端提供服務。
有內和外終端。有隨附的和超然的 tmux
會話,透過連接到伺服器和從tmux
伺服器分離的客戶端進行擴展。有積極的和不活躍的會話中的視窗tmux
。 shell 作業控制的概念背景和前景不參與。
答案2
Unix 進程可以透過兩種主要方式稱為「在背景運行」:
仍然由另一個進程(如 shell)作為父進程。如果您
&
在 Bourne shell 中使用該運算符,將會發生以下情況:sleep 10 &
該
sleep
進程將由 shell 在背景運行,因此它將繼續運行,但您可以與 shell 提示符互動並運行其他命令。如果像這樣在背景運行的程式嘗試讀取任何輸入,它將被訊號停止SIGTTIN
。然而,重要的是,它仍然屬於它啟動的 shell 進程,並且仍然連接到 tty(它運行的終端),並且如果 tty 關閉(ssh 連線中斷並且 shell 退出),則該進程將被殺死
SIGHUP
。這稱為 shell 作業控制 - 進程可以使用
&
或bg
或^Z
置於後台,然後使用fg
和 列出,jobs
等等。它的真正目的是在您處理另一個命令時暫時將一個命令置於後台,而不是用於需要安全防止 shell 退出和終端消失的長時間運行的進程。一個守護程式。這是一個完全脫離父進程及其 tty 的進程。它有一個新的進程組和會話 ID,其父進程是 PID 1(通常
init
,儘管在現代 Linux 上我相信systemd
已經接管了該角色)。由於守護程序不以 shell 為父進程,並且不附加到 tty,因此當 shell 退出或 tty 關閉時,它不會被終止。它必須由系統或使用者明確終止。大多數 Unix 系統都附帶許多預設守護程序來執行各種操作。
這是一個廣泛的解釋,還有很多關於 shell 作業控制和守護程序的細節我沒有提到。
有一個名為的程式nohup
可以使程式以 (1) 忽略該SIGHUP
訊號運行,這樣當 tty 關閉時它就不會退出。這並不能使它成為真正的守護進程,但對於僅輸出而不需要任何輸入的簡單作業很有用。
tmux 是一個作為守護程序運行的程序,但允許您在其中運行其他程序(shell 或其他任何程序)。 tmux 比nohup
您可以運行全螢幕程式以及需要輸入和輸出的程式複雜得多。因為它是一個守護進程,所以當 tty 消失時(例如當 ssh 連線中斷時),它不會被殺死。
在 tmux 中,「附加」表示 tmux 在終端機上顯示一個或多個在其中運行的進程。您可以從該終端「分離」tmux,然後再次將其「附加」到另一個終端。如果 ssh 連線中斷或被終止,分離會自動發生。因此,您可以關閉終端和 ssh,然後從不同的終端連接並附加 tmux,一切都保持原樣。