SSH断开后会话终止是因为shell进程受终端控制,收到SIGHUP信号而退出;tmux通过后台服务托管会话,使其脱离终端生命周期。

为什么直接 ssh 连服务器后关终端就断会话
因为默认的 ssh 会话绑定在当前终端进程上,窗口关闭或网络中断会导致 shell 进程收到 SIGHUP 被终止,所有前台运行的命令(包括 top、tail -f、vim)全退出。这不是网络问题,是进程生命周期管理机制决定的。
解决思路不是“保活连接”,而是让会话脱离终端控制——tmux 正是干这事的:它启动一个后台服务进程(tmux server),所有你创建的会话(session)、窗口(window)、面板(pane)都由它托管,即使你断开 ssh,只要服务器没重启,会话就一直活着。
安装与首次启动 tmux 后必须做的三件事
Debian/Ubuntu:sudo apt install tmux;CentOS/RHEL:sudo yum install tmux 或 sudo dnf install tmux。装完别急着用,默认配置反人类:
- 前缀键是
Ctrl-b,左手小拇指按得想砸键盘——立刻改掉:
编辑~/.tmux.conf,加一行:set -g prefix C-a(用Ctrl-a更顺手) - 默认不启用鼠标支持,无法点选窗口/面板——加:
set -g mouse on - 新窗口默认不继承当前路径,
cd /var/log后开新窗又回到~——加:bind c new-window -c '#{pane_current_path}'
改完执行 tmux source-file ~/.tmux.conf 热加载,或新开一个 tmux 会话生效。
日常运维中最常用的 5 个 tmux 操作组合
记住前缀键(比如设成 Ctrl-a)后,所有操作都是「前缀 + 命令键」。别死记,先练这五个高频场景:
- 新建会话并命名:
tmux new-session -s prod-db(名字别用空格,后续靠它恢复) - 分离当前会话(不断开服务,只退出终端显示):
Ctrl-a d - 列出所有存活会话:
tmux ls→ 显示类似prod-db: 1 windows (created ...) - 重新连接指定会话:
tmux attach-session -t prod-db(-t是 target,不是 “team”) - 在一个会话里开多个窗口干活:
Ctrl-a c(新建窗口),Ctrl-a n(切到下一个),Ctrl-a p(切到上一个),窗口名默认是 shell 名,可按Ctrl-a ,改名
注意:tmux attach-session 如果只写 -t 不带值,它会连最近一次使用的会话;但生产环境强烈建议显式写全名,避免连错。
断网重连后找不到会话?检查这三个地方
常见现象:tmux ls 返回空,或提示 no server running。不是会话丢了,是 tmux server 进程意外退出了:
- 确认是否真有残留进程:
ps aux | grep tmux,若无tmux: server行,说明 server 已死 - 检查磁盘空间:
df -h,/tmp或/var/run满了会导致 tmux socket 创建失败(socket 默认在/tmp/tmux-$(id -u)/) - 用户级 tmpfs 被清空(某些云主机或容器环境):改 socket 路径,在
~/.tmux.conf加set -g default-path "$HOME"并确保$HOME/.tmux目录存在
最稳妥的运维习惯是:每次登录先跑 tmux ls,没输出就 tmux new -s $(hostname)-$(date +%H%M) 新建一个带时间戳的会话,避免依赖上次状态。


















