
我有 2 台主機,可以透過 SSH 連接它們。在一台主機上,一段時間後,我收到錯誤Write Failed: broken pipe.
在另一台主機上,我沒有收到此錯誤。
我不明白為什麼在一台主機上出現這個問題,而在另一台主機上一切正常。
因此,我設定了與 tmux 的 SSH 連接,並在遠端主機內執行一個前台進程 (celeryd)。但是,即使 SSH 會話失敗,並且我重新連接到已刪除的會話,前台進程也已終止。
我希望當 SSH 連線中斷時,前台進程不會停止。所以,我只有兩個解決方案:
- 知道如何避免 SSH 破壞管道,或者
- 知道如何避免 SSH 連線中斷時進程終止。
誰可以幫我這個事?
答案1
我不知道您的 SSH 連線會發生什麼情況,但可能是網路連結不良?您可以嘗試使用莫許,這比常規 SSH 連線更可靠。尤其是當網路出現問題時。
如果您無法修復連接,您可以嘗試nohup
在命令前面使用,或者只是nohup tmux
看看是否會改變任何內容。
nohup - 執行不受掛起影響的命令,並將輸出輸出到非 tty
概要
nohup 指令 [ARG]...
nohup 選項
答案2
我只遇到過這個問題幾次。對我來說,導致管道破裂的原因是缺乏路線。只有當從主網路上的實體機連接到 Nat 後面的不同網路上的虛擬機器時,才會發生這種情況。
我會檢查網路問題,看看是否可以阻止管道破裂的發生。
如果您找不到問題的原因,您可以使用 screen 或 tmux 等工具來保持終端打開,即使您已斷開連接。然後您可以重新連接並連接到螢幕或 tmux 會話,您的進程仍將運行並處於活動狀態。
答案3
對我來說,ssh 斷開連線最常見的原因是沒有保持活動狀態。它可以在 ssh 客戶端中設定。如果使用 ssh,則為“-oTCPKeepAlives=yes”
對於ssh關閉後執行的程序,當您在shell中執行程式時,它是shell實例的子進程。一旦它關閉,孩子們也關閉。您可以嘗試在末尾添加 & 來運行程序,這會產生不同的進程。我剛剛做了一個快速測試,在 ssh 連接斷開後,該過程似乎仍在繼續。