SSH断开后重新连接

时间:2023-02-04 17:28:21

SSH断开问题
SSH断开后如何重新连接可能一致困扰着诸多用户。使用screen命令可在重新建立SSH时重新打开之前的连接。
SIGHUP 信号

让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

1、开启Screen:
a)screen
b)screen [command]:退出vi将退出该窗口/会话
c)当前screen窗口中键入C-a:screen 在该会话内生成一个新的窗口并切换到该窗口
2、退出Screen:exit
C-a w 显示所有窗口列表
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式
-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话
启动一个初始状态断开的screen会话:screen -dmS mygdb gdb execlp_test 连接该会话:screen -r mygdb

Screen 默认情况下无提示当前状态功能,可做如下设置:
$vi ~/.screenrc
插入:caption always “%{.bW}%-w%{.rW}%n %t%{-}%+w %=%H %Y/%m/%d”
输入:”:wq”(保存)
退出screen后再次打开,即可见到左下角显示:0 bash 1bash

参考文档:
http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
http://blog.csdn.net/asx20042005/article/details/7035115
http://blog.csdn.net/xocoder/article/details/9173845