tmux:关掉终端也不中断的后台任务
我第一次用 tmux,是因为一次挺狼狈的经历。那天下午我在服务器上跑模型训练,命令跑起来之后,我顺手把 SSH 窗口关了,想着“反正跑完我再看”。结果再登上去一看,进程早没了,日志停在半路,训练白等了两小时。从那之后我就养成了习惯:只要是“跑起来就没必要一直盯着的活”,一律先扔进 tmux。
先说清楚 tmux 到底解决什么,它治的病主要是三个。
第一个是“关终端任务就死”。Linux 上你关掉终端,前台进程会收到 HUP 信号然后被干掉,不管它是训练脚本还是 tail -f。tmux 相当于在你的机器上开了一间独立的“进程客厅”:会话跑在 tmux 服务端里,终端只是它的显示器。你把显示器拔了,客厅里的电还接着。
第二个是“长任务想断开但又怕断”。以前我的做法是 nohup cmd & 加 > log 2>&1,倒也能用,但你只能靠 tail 猜进度,还没法中途钻进去看交互式提示。tmux 让你可以随时走人、随时回来。
第三个是“远程多窗口协作”。在服务器上同时要看日志、跑命令、盯监控,以前得开一堆 SSH 标签页。tmux 一个会话里可以切窗口、可以分屏,布局留在服务器上,你什么时候连上去看到的都是原样。
装起来
sudo apt install tmux
完整实战流程
新建一个叫 train 的会话:
tmux new -s train
进去之后正常敲你的命令,比如 ./train.py --epochs 100。底部会出现一条状态栏,左边写着 0:train,这就是你现在的会话名。
跑着跑着想去泡杯咖啡,按 Ctrl-b,松手,再按 d。屏幕上跳出 [detached from train],你回到了普通 shell,而训练还在服务器上跑得好好的。
查一下当前有哪些会话在跑:
tmux ls
输出大概长这样:
train: 1 windows (created Wed Oct 21 22:10:23 2026)
想回来的时候:
tmux attach -t train
进去之后那个滚动屏幕、跑了一半的日志都还在原地,跟你从没离开过一样。
不想要了,干净收工:
tmux kill-session -t train
顺手记几个快捷键
tmux 所有快捷键都是两段式的:先按 Ctrl-b(叫前缀键),松开,再按第二个键。我刚开始老是把 Ctrl-b 和 d 一起按,结果什么都没发生,记住要分两下。
Ctrl-bd:detach,离开但不杀任务Ctrl-bs:列出所有会话,方向键选,回车切过去Ctrl-b%:左右分屏Ctrl-b":上下分屏Ctrl-b方向键:在分屏之间挪Ctrl-bc:开一个新窗口Ctrl-bn/p:切换上/下一个窗口Ctrl-bz:把当前窗口放大成全屏,再按一次还原
几个我常用的顺手操作
一是后台直接起一个会话,不进交互界面:
tmux new -s build -d './build.sh 2>&1 | tee build.log'
二是想知道跑到哪了,但不想 attach(远程机上 attach 会抢终端):
tmux capture-pane -p -t build | tail -20
三是跑任务时实时把屏幕内容存进日志:
tmux pipe-pane -o -t build 'cat >> build.log'
还有个小坑:会话名和窗口名容易搞混,tmux ls 看到的是会话,attach -t 跟的也是会话。别把窗口号当会话名用。
现在我的习惯是:任何超过两分钟的任务都先 tmux new -s,跑完再 kill-session 清干净。关终端、关标签页、断网,都不再影响它了。
- 点赞
- 收藏
- 关注作者
评论(0)