SSH 断了任务就没了?tmux 让长命令在服务器上"常驻后台"

举报
yd_260072176 发表于 2026/11/01 06:29:38 2026/11/01
【摘要】 昨晚在云服务器上跑一份几百 MB 的数据备份,rsync 传到一半,本地 Wi-Fi 闪断了一下——SSH 断了。重连上去一看,rsync 进程已经没了,传了一半的文件还得重来。这是很多新手第一次吃的大亏:SSH 会话断开时,终端会给它名下的所有进程发 SIGHUP,默认动作是直接杀掉。跑个几秒的命令无所谓,跑几十分钟的备份、编译、下载,断一次就得重来。nohup 是最常见的土办法:nohu...

昨晚在云服务器上跑一份几百 MB 的数据备份,rsync 传到一半,本地 Wi-Fi 闪断了一下——SSH 断了。重连上去一看,rsync 进程已经没了,传了一半的文件还得重来。

这是很多新手第一次吃的大亏:SSH 会话断开时,终端会给它名下的所有进程发 SIGHUP,默认动作是直接杀掉。跑个几秒的命令无所谓,跑几十分钟的备份、编译、下载,断一次就得重来。

nohup 是最常见的土办法:nohup rsync -av /data/ /backup/ &。它能让进程忽略 SIGHUP 继续跑,输出扔进 nohup.out。但它有两个硬伤:一是进程跟终端彻底脱钩,你中途想看进度只能 tail 日志,想交互输入(比如输密码)没门;二是输出全挤在一个 nohup.out 里,多任务并行时一团糟。

tmux 解决的是另一个层面的问题:它在服务器上造了一个"虚拟终端层",你的命令跑在 tmux 的会话里,而不是直接挂在 SSH 连接下。SSH 断了,会话还在服务器上好好活着;你重新连上,attach 回去,屏幕内容、滚动历史、运行中的进程原样都在。

五分钟上手。安装(一行):sudo apt install tmux(Debian/Ubuntu);sudo yum install tmux(CentOS/RHEL)。

新建会话并起个名字(名字很重要,默认的 0、1、2 过两天你就忘了哪个是哪个):tmux new -s backup。现在你就在 tmux 里了,跑你的长命令:rsync -av --progress /data/ /backup/2026-11-01/。分离(detach):按 Ctrl+b,松开,再按 d。你会回到原来的 shell,看到 [detached (from session backup)]。这时你可以直接 exit 断开 SSH,甚至关机睡觉。

重连后恢复:tmux attach -t backup(或简写 tmux a -t backup)。屏幕回到你离开时的样子,rsync 还在跑,进度条接着走。

常用操作速查。会话管理:tmux ls 列出所有会话;tmux new -s <name> 新建;tmux a -t <name> 接入;tmux kill-session -t <name> 杀掉指定会话;tmux kill-server 杀掉所有会话(谨慎)。会话内(前缀键都是先按 Ctrl+b):d 分离;c 新建窗口;n / p 下一个/上一个窗口;, 给当前窗口改名;% 左右分屏," 上下分屏;方向键在分屏间切换;x 关闭当前分屏。窗口改名是个好习惯:Ctrl+b , 输入 rsync-backup,以后 tmux ls 一眼就知道每个会话在干嘛。

三个真实踩坑。1. 嵌套 tmux 前缀键打架。本地终端开了 tmux,又 SSH 到服务器再开 tmux,两层都用 Ctrl+b,你按一次只会触发外层。解决:内层命令按两次 Ctrl+b(第一次被外层吃掉,第二次透传),或者给服务器上的 tmux 换个前缀键(~/.tmux.conf 里写 set -g prefix C-a)。2. tmux 里鼠标滚轮翻不动历史。默认 tmux 接管了滚动,滚轮只会滚动当前屏。在 ~/.tmux.conf 加一行 set -g mouse on,然后 tmux source-file ~/.tmux.conf 或重启会话生效。开了之后分屏还能用鼠标点选切换,终端体验好很多。3. 服务器重启,会话照样没。tmux 保的是"SSH 断开",不是"机器重启"。重启后会话清空是正常的。真想跨重启恢复,用 tmux-resurrect 插件(Ctrl+b Ctrl+s 保存,Ctrl+b Ctrl+r 恢复),或者干脆把关键任务写成 systemd service(开机自启那套),tmux 只管"不断线"。

什么时候用 tmux,什么时候不用:长耗时、怕断的任务(备份、编译、大文件传输),tmux 是正解;开机就要在、无人值守必须自愈的服务,用 systemd,别用 tmux 顶着;一次性几秒的小命令,直接跑,别折腾。

记住核心一句话:tmux 管的是"连接断不断",systemd 管的是"机器开不开"。两个配合,服务器上的任务才算真正稳了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。