7

我知道这类问题已经被问了很多年,他们的答案通常是Screentmux.

screen如果我知道我会长时间离开会话,或者网络太糟糕而无法保持可靠的连接,我肯定会在开始时使用。

主要问题是当我开始一些会话并发现它必须持续很长时间,或者连接只是意外丢失。在后一种情况下,通常当我立即启动另一个会话时,我会发现之前的进程当时并没有被杀死,但我无法重新连接到他们的终端。

所以我想知道是否有可能在意外断开 SSH 会话后防止正常进程被杀死甚至很长时间。最重要的是我可以重新连接到他们的终端,而无需提前在 Screen 中启动它们

如果没有,是否可以将已经启动的裸 ssh 会话移动到新的 Screen 会话中以供以后重新连接?

4

3 回答 3

3

我不相信没有像屏幕这样的东西是可能的。一旦你的伪 TTY 丢失,我几乎可以肯定它无法从不同的 shell 中恢复(至少在没有一些 narly hack 的情况下不能恢复)。

至于将现有流程添加到新屏幕,我认为这是可能的。试试这里的说明:

http://monkeypatch.me/blog/move-a-running-process-to-a-new-screen-shell.html

首先要做的是暂停进程。就我而言,Irssi 可以通过键入Ctrl+来暂停Z

其次,在后台恢复进程:

$ bg

现在,我们将把进程从它的父进程(shell)中分离出来。因此,当父进程终止时,子进程(Irssi)将能够继续。为此,我们使用 disown 内置函数:

$否认irssi

启动屏幕会话:

$屏幕

由于我们在屏幕会话中,我们将检索 irssi 进程。为此,我们使用带有 pid 的 reptyr 命令:

$ 复制人

为了避免繁琐的 pid 研究,我们可以使用 pgrep 命令:

$ reptyr $(pgrep irssi)

现在该进程在屏幕外壳中,我们可以安全地分离我们的会话,而不再担心杀死我们的 X 服务器或关闭我们的 ssh 连接。

为此,您需要reptyr

选项 2:

我怀疑您可能正在尝试解决错误的问题。如果您的 SSH 连接断开,为什么不解决这个问题呢?您可以通过调整连接设置将 SSH 设置为对超时和断开连接的容忍度极高。

在您的客户端上,$HOME/.ssh/config添加:

ServerAliveInterval 60
ServerAliveCountMax 5

现在,即使服务器 5 分钟没有响应,您的会话也不会超时。

于 2013-11-22T02:37:13.217 回答
1

使用 ssh-tmux 代替 tmux:

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}
于 2016-03-22T23:43:10.997 回答
0

我使用nano处理一个文本文件,但我断开了连接。登录后,我看到上一个会话中的 nano 进程仍在运行,但我无法切换到该 nano 实例。所以,我杀死了 nano 进程,然后它创建了名为 filename.save 的文件。从第一次会议开始,我就有了变化。

于 2016-12-02T13:51:47.547 回答