SSH 断线任务就没了?tmux 让你的命令一直在跑
做后端开发,经常要 SSH 到服务器上跑一个耗时任务:导数据、跑脚本、压测,一跑就是几个小时。我的噩梦经历:有一次导库导到一半,家里的 Wi-Fi 闪断了一下,SSH 一断,导入进程直接被杀,几个小时白跑。后来同事教我用 tmux,这类问题就再没发生过。这篇把 tmux 最实用的用法写下来,给还在用"SSH 一直开着不敢关"的人参考。
tmux 是什么
简单说,tmux 是一个"终端会话管理器"。它在服务器上创建一个独立的会话,你在这个会话里跑的命令,和你的 SSH 连接是解耦的:SSH 断了,会话还在服务器上活着,里面的进程照常运行;你重新连上服务器,再"接回"这个会话,画面和断开前一模一样。
三个命令,上手就够
创建一个新会话(给它起个名字,方便找回):
tmux new -s deploy
这时候你就在新会话里了,正常跑你的耗时命令就行。想暂时离开这个会话、回到普通终端,按 Ctrl+b 再按 d(detach,分离)。屏幕一闪,你就回到了原来的终端,而会话里的任务还在后台跑。
第二天重新 SSH 上服务器,接回会话:
tmux attach -t deploy
画面回来了,任务进度都在。就这么简单:建会话、分离、接回,日常 90% 的场景只用这三个动作。
常用操作速查
会话多了,记不住名字,用这条列出所有会话:
tmux ls
输出类似 deploy: 1 windows (created ...)。想结束一个会话,先接回去,在里面输入 exit,或者直接杀掉:
tmux kill-session -t deploy
还有一个很多人不知道的技巧:在一个会话里按 Ctrl+b 再按 "(双引号),屏幕会上下分成两个窗格;Ctrl+b 再按 % 是左右分屏。用方向键配合 Ctrl+b + 方向键在窗格间切换。一边 tail 日志、一边跑命令,不用来回开多个 SSH 窗口。
我踩过的两个坑
第一个坑:直接关掉 SSH 客户端窗口(比如笔记本合盖),而不是先 detach。虽然 tmux 会话本身不受影响,但如果你在会话里跑的是交互式程序(比如需要输入 yes/no 的安装脚本),它会卡在那里等你输入,你接回去才能继续。所以长时间任务尽量用非交互模式跑,或者把输入提前准备好。
第二个坑:服务器重启。tmux 会话是保存在内存里的,机器一重启就没了。它防的是"网络断线",不是"机器重启"。如果你的任务真的跑了十几个小时,重要的中间结果还是要落盘,别全指望会话。
写在最后
tmux 解决的是一个很具体但很痛的场景:SSH 连接不可靠,但服务器上的任务必须可靠。建会话、分离、接回,三步记住,断线再也不是灾难。更进一步的话,可以学学它的窗口(window)和窗格(pane)管理,或者配合 tmux-resurrect 插件实现会话持久化,连重启都不怕。不过对大多数人来说,先把 detach 和 attach 用熟,收益已经足够大了。
- 点赞
- 收藏
- 关注作者
评论(0)