SSH会话随终端关闭而丢失,因远程shell受SIGHUP信号终止;tmux通过守护进程隔离会话,实现断线重连与布局恢复,需正确使用前缀键和透传快捷键。

为什么直接关终端就丢掉 ssh 会话?
因为默认的 ssh 连接是绑定在当前终端进程上的,一旦本地终端关闭或网络中断,远程 shell 进程就会收到 SIGHUP 被终止。Tmux 的核心价值不是“分屏”,而是给整个会话套上一层“容器”——它自己是守护进程,子 shell 是它的子进程,不依赖你本地终端是否存活。
实操建议:
- 连接服务器后第一件事不是跑命令,而是先执行
tmux new -s mywork(-s指定会话名,方便后续找回) - 不要用
tmux attach直连,改用tmux attach -t mywork,避免误连错会话 - 如果已断线重连,用
tmux ls查看残留会话,再tmux attach -t xxx恢复,而不是重新开 shell
Ctrl-b 后按什么才能真正分屏?
Tmux 默认前缀键是 Ctrl-b,但很多人按完没反应,其实是没松开 Ctrl 就直接按了方向键,或者误以为分屏是“自动”的。分屏必须显式触发,且水平/垂直有明确按键区分。
常用分屏操作(前缀后松手再按):
-
":上下分屏(horizontal split),新 pane 在下方 -
%:左右分屏(vertical split),新 pane 在右侧 -
o:在 pane 间循环切换(不是Tab) -
q:显示 pane 编号,再按编号跳转(比如q→1) -
x:关闭当前 pane(确认提示后按y)
注意:Ctrl-b 是“组合键前缀”,不是修饰键——不能按住不放;很多用户卡在这一步,反复按 Ctrl-b 不松手,结果只看到 [ 或无响应。
怎么让 Tmux 自动恢复上次的分屏布局?
Tmux 本身不保存 layout,断线重连后默认只恢复会话里还在运行的 shell,pane 数量和位置都会丢失。要持久化布局,得靠插件或手动导出/导入。
轻量方案(不装插件):
- 用
tmux list-windows -F '#{window_index}:#{window_layout}'导出当前 layout 字符串(如0:920x220,247x86,0,0[247x42,0,0,0,247x42,0,43,1]) - 下次新建会话后,用
tmux select-layout '上面那串'恢复(注意单引号包裹) - 把常用 layout 存成 alias,比如
alias tmux-web='tmux new -s web \; split-window -h \; select-pane -t 0 \; run-shell "vim"'
兼容性提醒:layout 字符串在不同终端尺寸下可能错位,别指望它 100% 精确还原;select-layout 对空 pane 无效,需先确保 pane 已创建。
为什么 Ctrl-c 有时杀不掉当前命令?
这是 Tmux 的「键盘劫持」副作用:当你在某个 pane 中运行交互式程序(如 vim、htop、python REPL),Tmux 默认不会把 Ctrl-c 当作信号转发给子进程,而是优先识别为自己的快捷键(比如复制模式入口)。结果就是按了没反应,或意外进入复制模式。
解决办法:
- 临时绕过:按
Ctrl-b再按Ctrl-c(即Ctrl-b Ctrl-c),强制将Ctrl-c透传给当前 pane - 永久修复:在
~/.tmux.conf加一行set -g prefix2 C-c,这样单独按Ctrl-c就能透传,不用再按前缀 - 更安全的习惯:对关键任务(如长时
curl或rsync),先Ctrl-z挂起,再kill %1杀后台作业,比狂按Ctrl-c可靠
容易被忽略的是:Tmux 的 copy mode(Ctrl-b [)一旦激活,所有键盘输入都进复制缓冲区,此时 Ctrl-c 完全失效——必须先按 q 退出 copy mode 才能恢复正常。


















