SSH 断线任务就没了?用 tmux 把远程会话留在线上
在服务器上跑一个耗时任务,最怕的不是慢,而是网络抖一下、笔记本合盖、SSH 断开,任务跟着一起没。很多人第一反应是 nohup 加后台符号硬扛,能用,但重连之后看不到输出、不好接管,任务到底跑到哪一步全靠猜。tmux 就是为这个场景准备的:会话活在服务器上,你的终端只是个窗口,断了随时接回来。
一、会话和窗口不是一回事
理解 tmux 先分清三个词:会话(session)是一组工作的集合,断开连接后它在服务器后台继续存在;窗口(window)像浏览器标签页,一个会话里可以开多个;窗格(pane)是把一个窗口再切成几块。日常用得最多的其实就一层:开一个会话,在里面跑任务,走人,回来再 attach 接上,任务从没停过。
这和 nohup 的本质区别在于可接管:nohup 只是让进程不随终端退出,输出重定向到文件就再也回不到交互界面;tmux 里进程始终挂在一个伪终端上,接回来就能继续看实时输出、继续敲命令。
二、最常用的四个动作
安装很简单,Ubuntu/Debian 上 apt install tmux 即可。日常操作记住四个就够了八成场景:
tmux new -s 名字,新建一个带名字的会话,名字按任务起,比如 deploy、backup,一眼知道哪个是哪个。直接在会话里正常跑你的命令就行。
要离开时按 Ctrl+b 再按 d,会话就 detach 到后台,SSH 也可以放心断开。注意是先松开 Ctrl+b 再单独按 d,tmux 的快捷键都是这个前缀逻辑。
回来时先 tmux ls 看一眼有哪些会话还在,再 tmux attach -t 名字接回去。接回的瞬间,屏幕就是你离开时的样子,长任务还在继续输出。
任务真跑完了,在会话里 exit 退出,最后一个窗口关掉会话自动结束;也可以 tmux kill-session -t 名字 手动清掉不用的会话,别攒一堆僵尸会话占着。
三、顺手好用的两个技巧
一是分屏:Ctrl+b 再按 % 左右分,按 " 上下分,方向键或者 Ctrl+b 再按 o 在窗格之间跳。一边跑任务一边 tail 日志,或者一边编辑配置一边看服务输出,不用来回开 SSH 连接。
二是滚动看历史输出:普通终端里滚轮就能翻,但 tmux 里要先按 Ctrl+b 再按 [ 进入复制模式,用方向键或 PageUp 往上翻,看完按 q 退出。长任务刷了几千行日志时,这个比把输出重定向到文件再 grep 方便。默认历史行数有限,长期用的话可以在 ~/.tmux.conf 里把 history-limit 调大,比如设成 10000 行。
四、几个容易踩的小坑
嵌套 tmux 时前缀键会打架:在本机 tmux 里再 SSH 进服务器开 tmux,按一次 Ctrl+b 只作用到外层,要操作内层得连按两次。偶尔遇到 attach 上去画面尺寸不对、花屏,退出后用 tmux attach -d -t 名字 ,-d 会把其他终端踢下线并按当前尺寸重排,一般就好了。
还有一点要提醒:tmux 保的是会话,不是任务本身。服务器重启,会话一样会没;任务跑到一半机器挂了,tmux 也救不回来。真正重要的长任务,还是要配合断点续跑或者 systemd 服务来托底,tmux 解决的是「连接断」而不是「机器断」。
小结
判断标准很简单:只要一个远程命令你担心「断线就白跑」,就先开 tmux 再跑它。new 建会话、d 放后台、ls 看列表、attach 接回来,四个动作形成习惯之后,网络再抖也不慌。再加上分屏和历史回滚,远程运维的体感会顺很多。
(本文为个人运维实践记录。)
- 点赞
- 收藏
- 关注作者
评论(0)