我有 2 台主机,可以通过 SSH 连接它们。在一台主机上,过了一会儿,我收到错误。Write Failed: broken pipe.
在另一台主机上,我没有收到此错误。
我不明白为什么在一个主机上会出现这个问题,而在另一个主机上一切正常。
因此,我已使用 tmux 设置了 SSH 连接,并在远程主机内部运行前台进程 (celeryd)。但是,即使 SSH 会话失败,并且我重新连接到断开的会话,前台进程也会终止。
我希望 SSH 连接中断时前台进程不会关闭。因此,我只有两个解决方案:
- 知道如何避免 SSH 管道中断,或者
- 知道如何避免 SSH 连接中断时进程终止。
谁可以帮我这个事?
答案1
我不知道你的 SSH 连接出了什么问题,但可能是网络连接不好?你可以尝试使用莫沙必利,这比常规 SSH 连接更强大。特别是当网络是问题所在时。
如果您无法修复连接,您可以尝试nohup
在命令前面使用或只是nohup tmux
看看是否有什么改变。
nohup-运行不受挂断影响的命令,并将输出输出到非tty
摘要
nohup 命令 [参数]...
nohup 选项
答案2
我只遇到过几次这个问题。对我来说,导致管道断裂的原因是缺少路由。这种情况只发生在从主网络上的物理机器连接到 Nat 后面不同网络上的虚拟机时。
我会检查网络问题,看看是否可以阻止管道破裂的发生。
如果找不到问题的原因,可以使用 screen 或 tmux 等工具来保持终端打开,即使您已断开连接。然后您可以重新连接并连接到 screen 或 tmux 会话,您的进程仍将运行并处于活动状态。
答案3
对我来说,ssh 断开连接最常见的原因是没有保持连接。它可以在 ssh 客户端中设置。使用 ssh,它将是“-oTCPKeepAlives=yes”
关于在 ssh 关闭后运行的程序,当您在 shell 中运行程序时,它是 shell 实例的子进程。一旦它关闭,子进程也会关闭。您可以尝试在程序末尾添加 & 来运行程序,这将产生不同的进程。我刚刚做了一个快速测试,在 ssh 连接断开后,该进程似乎仍在继续。