SSH 一断长任务就没了:用 tmux 让会话在后台接着跑
在服务器上跑一个要花半小时的备份或编译,SSH 刚连上、命令刚敲下去,网络一抖、窗口一关,任务就跟着断了。重新连上去一看,进程早已不在,只能从头再跑一遍。问题不在命令本身,而在会话:SSH 断开时,终端会话里的前台进程会收到挂断信号,默认随之退出。解决办法是把任务放进一个能脱离终端独立存在的会话里,tmux 就是干这个的。
新建会话,任务跟会话走
先装上它:sudo apt install tmux(Debian/Ubuntu)或 sudo dnf install tmux(RHEL 系)。装好后敲:
tmux new -s backup
-s backup 是给会话起个名字,之后找它就靠这个名字。会话里就是一个普通的终端,该敲什么敲什么,比如启动备份脚本。任务跑起来之后,按 Ctrl+b 再按 d,就把会话“分离”(detach)了:终端回到 SSH 原来的提示符,tmux 会话和里面的任务继续在后台跑。SSH 断不断线,已经和它没关系了。
回来之后,接回原来的会话
第二天重新 SSH 登录,先看有哪些会话还在:
tmux ls
输出里会列出会话名和创建时间。接回去很简单:
tmux attach -t backup
如果只有一个会话,连名字都可以省,tmux attach 直接接回。屏幕上就是你离开时的样子:备份脚本跑到哪一行、输出了什么,都原样保留。接回、看一眼进度、再 Ctrl+b d 分离,整个过程不用动正在跑的任务。
一个会话里不止能做一件事
tmux 会话里可以开多个窗口和窗格,各做各的事,互不干扰:
Ctrl+b c:新建一个窗口,比如一个窗口跑备份、另一个窗口看日志。Ctrl+b n/Ctrl+b p:在窗口之间前后切换。Ctrl+b %:把当前窗口左右分成两个窗格;Ctrl+b "是上下分;Ctrl+b 方向键在窗格之间移动。Ctrl+b x:关闭当前窗格;Ctrl+b &:关闭当前窗口。
窗口和窗格只是组织方式,真正重要的是:它们都属于同一个会话,SSH 断了整个会话都在,回来全部接得上。
两个容易踩的坑
第一,退出会话和分离会话不是一回事。在 tmux 里敲 exit 是结束当前终端,窗口里的终端全退出了,会话也就没了;要离开请用 Ctrl+b d 分离。想彻底结束一个会话,用 tmux kill-session -t backup,或者在会话里把所有窗口都 exit 掉。
第二,翻历史输出要进“复制模式”:按 Ctrl+b [,然后用方向键或 PageUp/PageDown 翻页,看到要找的内容后按 q 退出。直接用鼠标滚轮在很多终端里是翻不动 tmux 内容的,第一次用的人常以为输出丢了,其实只是没进复制模式。
小结
长任务怕的不是跑得慢,而是 SSH 一断就前功尽弃:tmux new -s 名字 新建会话、Ctrl+b d 分离、tmux ls 查看、tmux attach -t 名字 接回,四个动作就能让任务脱离 SSH 会话独立运行。窗口和窗格用来在一个会话里并行做几件事,复制模式用来翻历史输出。以后再遇到“跑半小时的任务”,先开 tmux 再敲命令,网络抖动就不再是事故了。
- 点赞
- 收藏
- 关注作者
评论(0)