SSH 会话保持与重连方法

exit ssh连接后,指定应用还在会话里运行?如何重新登陆到 之前 exit 的shell会话里?

nohup可以实现后台运行,但这种无法实现“重新登陆到之前的 shell 会话”。因为它没有会话,只有进程,所以只能通过ps -e | grep -e 'PID' -e 'xxx'找到进程。

# 仅保持进程运行,无法重新连接交互界面
nohup python3 long_running_task.py > output.log 2>&1 &

终端复用器

在ssh连接bash后:

  1. 如何实现 exit ssh连接后,指定应用还在会话里运行?
  2. 如何重新登陆到 之前 exit 的shell会话里?

解决方案:终端复用器。标准的 ssh 连接断开后,其分配的伪终端(pty)和所有子进程(包括你的应用)默认都会收到 SIGHUP 信号而终止。要让应用脱离 SSH 会话独立运行,并能随时“重新连接”回原来的会话环境,就需要用到 screen 或 tmux 这样的工具。

$ sudo apt install tmux  # 基本默认安装了
# 1. SSH 登录后,创建新会话
$ tmux new -s myapp
# 2. 运行应用
$ python3 long_running_task.py
# 3. 分离会话
# 按住 Ctrl 键,依次按 B 键,然后按 D 键

此时,你可以安全地输入 exit 断开 SSH 连接。 服务器上的 screen 或 tmux 进程会作为守护进程继续运行,其中的应用也会持续执行。

当你再次通过 SSH 连接到服务器后,只需重新附着(attach)到之前创建的会话即可。

# 列出所有 tmux 会话
$ tmux ls
myapp: 1 windows (created ...)
# 重新连接
$ tmux a -t myapp

tmux 使用

会话:新建/查看/转后台/进入/关闭

$ tmux                   # 新建无名会话,并进入
$ tmux new -s viewLog    # 新建指定会话名,并进入;
# 新建后台会话(不进入):tmux new -s 会话名 -d
$ tmux ls                # 查看会话,:前面的是会话名,下面示例是0与viewLog
0: 1 windows (created Wed Jul 29 19:14:05 2026)
viewLog: 1 windows (created Wed Jul 29 19:44:32 2026) (attached)

# 分离会话,转到后台运行:按住 Ctrl + B + D 键

$ tmux a -t 会话名        # 进入现有会话,在进入会话后,在底部有一个绿条,最左侧是会话名

三种关闭会话,推荐第一种

$ exit                           # 在会话内部,正常退出窗口,最后一个窗口退出则会关闭会话;
$ tmux kill-session              # 在会话内部,强制杀死当前会话
$ tmux kill-session -t viewLog   # 在会话外部,强制杀死指定会话
$ tmux kill-server               # 关闭所有 tmux 会话

会话内:会话、窗口与窗格

三层结构:Session(会话) → Window(窗口) → Pane(窗格)

  • Session(会话)= 浏览器,你可以电脑打开多个会话;
    • 不同会话之间:环境变量、当前路径、后台任务完全隔离
  • 窗口(Window) = 浏览器里的一个标签页(整个屏幕只显示一个内容)。
    • 同一会话内的不同窗口:共享同一个 tmux 后台进程,但每个窗口有自己独立的 Shell 环境(可以分别 cd 到不同目录,互不干扰)。
  • 窗格(Pane) = 在这个标签页里,把屏幕切割成好几块(左右分屏、上下分屏)。
    • 窗格依附于窗口存在,但不同的窗格,能运行不同程序

前缀键/prefix:默认 Ctrl + b(先按这组,再按后面命令)

会话管理窗口管理切换窗口
prefix + $:重命名当前会话prefix + c:新建窗口prefix + p:上一个窗口
prefix + s:列出并切换会话prefix + ,:重命名当前窗口prefix + n:下一个窗口
prefix + &:关闭当前窗口prefix + 0~9:切换到对应编号窗口
prefix + w:预览选择窗口
窗格新增分屏切换窗格调整布局
prefix + %:垂直分屏prefix + 方向键:切换上下左右窗格prefix + z:当前窗格全屏/恢复
prefix + ":水平分屏prefix + o:循环切换窗格prefix + 空格:循环切换预设布局
prefix + ;:切换到上一个窗格prefix + !:把当前窗格转为独立窗口

窗格分割的切换方法

目标布局快捷键(先按 Ctrl+b)效果说明
左右并排(水平分割)prefix 松开后,按 Alt+1所有窗格平均左右排列(一横行)
上下堆叠(垂直分割)prefix 松开后,按 Alt+2所有窗格平均上下排列(一竖列)
平铺(均匀网格)prefix 松开后,按 Alt+5自动按比例排成类似“棋盘”的网格

其他:复制/滚动/翻页

  • prefix + [:进入复制/滚动模式
    • 方向键 / PageUp / PageDown 滚动
    • 空格 开始选择,回车 复制
  • prefix + ]:粘贴
  • prefix + f:在窗格内容中搜索

其他:常用配置(~/.tmux.conf)

# 前缀改为 Ctrl+a(习惯 screen 的人)
# set -g prefix C-a
# unbind C-b
# bind C-a send-prefix

# 鼠标支持(点击切换窗格/滚动),**使用方便**
set -g mouse on
# 窗口从1开始编号
set -g base-index 1
# 状态栏颜色
set -g status-style bg=black,fg=green

修改后生效:

tmux source ~/.tmux.conf

发表回复