我知道这些问题已被问过多年,而答案往往是screen
或tmux
。
如果我知道我将离开会话很长时间,或者网络太糟糕而无法维持可靠的连接,我肯定会在开始时使用screen
。
主要问题是,当我开始某个会话并发现它必须持续很长时间,或者连接只是意外丢失时。在后一种情况下,通常当我立即开始另一个会话时,我可以发现之前的进程没有被杀死,但我无法重新连接到他们的终端。
所以我想知道在意外断开ssh会话后很长时间内是否有可能阻止正常进程被杀死。最重要的是我可以重新连接到他们的终端,而不是提前screen
启动。
如果没有,是否可以将已经启动的裸ssh会话移动到新的screen
会话中以便以后重新连接?
答案 0 :(得分:2)
我不相信没有像屏幕这样的东西。一旦你的伪TTY丢失,我几乎可以肯定它无法从一个不同的shell中恢复(至少在没有一些麻烦的情况下)。
至于将现有流程添加到新屏幕,我认为这是可能的。请尝试此处的说明:http://monkeypatch.me/blog/move-a-running-process-to-a-new-screen-shell.html
The first thing to do is to suspend the process. In my case, Irssi can be suspended by typing ctrl+z.
Secondly, resume the process in background:
$ bg
Now, we will detach the process from its parent (the shell). So, when the parent process will be terminated, the child (Irssi) will be able to continue. For this, we use the disown builtin:
$ disown irssi
Launch a screen session:
$ screen
As we are in a screen session, we will retrieve the irssi process. To do so, we use the reptyr command which take a pid:
$ reptyr <pid>
To avoid the tedious pid research, we can use the pgrep command:
$ reptyr $(pgrep irssi)
Now the process is in a screen shell, we can safely detach our session and no longer worry about killing our X server or close our ssh connection.
你需要reptyr。
选项2:
我怀疑你可能正试图解决错误的问题。如果您的SSH连接丢失,为什么不解决这个问题?您可以通过调整连接设置将SSH设置为非常容忍超时和断开连接。
在您的客户端上,$HOME/.ssh/config
添加:
ServerAliveInterval 60
ServerAliveCountMax 5
现在,即使服务器在5分钟内没有响应,您的会话也不会超时。
答案 1 :(得分:0)
使用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'
}
答案 2 :(得分:0)
我使用nano工作了一个文本文件,我断开连接。登录后,我看到上一次会话中的nano进程仍在运行,但我无法切换到该nano实例。所以,我杀死了nano进程然后它创建了名为:filename.save的文件,它在第一次会话中进行了我的更改。