SSH 損壞的管道會殺死前台進程

SSH 損壞的管道會殺死前台進程

我有 2 台主機,可以透過 SSH 連接它們。在一台主機上,一段時間後,我收到錯誤Write Failed: broken pipe.在另一台主機上,我沒有收到此錯誤。

我不明白為什麼在一台主機上出現這個問題,而在另一台主機上一切正常。

因此,我設定了與 tmux 的 SSH 連接,並在遠端主機內執行一個前台進程 (celeryd)。但是,即使 SSH 會話失敗,並且我重新連接到已刪除的會話,前台進程也已終止。

我希望當 SSH 連線中斷時,前台進程不會停止。所以,我只有兩個解決方案:

  1. 知道如何避免 SSH 破壞管道,或者
  2. 知道如何避免 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 連接斷開後,該過程似乎仍在繼續。

相關內容