《SSH 断开就重跑?Tmux 入门:让远程任务在服务器上一直活着》
很多新手在云服务器上跑任务时都吃过这个亏:本地 SSH 窗口一关、网络一抖,后台跑的程序就被 kill 了,第二天登录一看,训练、同步、备份全停了,还得从头来。
其实问题不在程序,而在「会话」:SSH 连接一断,它派生的子进程会收到 SIGHUP 信号,默认动作是退出。`nohup` 是一味药,但不够全:你再连回去,想看看输出、打个 Ctrl+C 都不行——进程早脱离了终端。
真正对味的工具是 tmux:终端复用器。它在服务器上常驻一个 session,把伪终端和程序一起托管,你本地断线只是「抽掉显示器」,程序继续跑;再连回去 `tmux attach`,画面原样回来,输出一字不落。
安装很简单:`sudo apt install tmux`(Ubuntu/Debian)或 `sudo yum install tmux`(CentOS 系)。上手只记四个命令:
1. `tmux new -s work`:新建一个叫 work 的会话,进去随便跑。
2. `Ctrl+b` 再按 `d`:detach,安全断开,手里的程序继续跑。
3. `tmux ls`:列出所有会话。
4. `tmux attach -t work`:回到 work 会话。
再往里走一点,tmux 的窗口(window)和面板(pane)才是效率翻倍的地方。一个会话里 `Ctrl+b c` 新建窗口、`Ctrl+b n/p` 切换,`Ctrl+b %` 左右分屏、`Ctrl+b "` 上下分屏——日志、编辑器、htop 三个面板同屏,排查问题不用再开三个 SSH 标签页。复制模式(`Ctrl+b [`)还能用键盘翻历史输出、选中复制,纯键盘流。
几个实战经验:
第一,名字起得见名知义。`work`、`train`、`deploy` 比默认的 `0`、`1` 好认十倍,尤其你同时挂五六个会话的时候。`tmux new -s` 一开始就命名,省得以后 `tmux rename-session -t 0 xxx` 再改。
第二,配个自动续命。服务器重启后 tmux 会话会消失,这是它唯一的短板。解决办法是配合 systemd:把关键任务写成 service 单元让 systemd 托管;临时任务才用 tmux。两者分工:tmux 管「人要看的交互过程」,systemd 管「机器自己跑的守护任务」。
第三,防坑:别在 tmux 里再套 tmux(前缀键会打架),要用嵌套就把外层的改成 `Ctrl+a`。另外 tmux 默认滚动是关闭的,笔记本触控板滚不动别慌,进复制模式再滚,或者在 `~/.tmux.conf` 里加一句 `set -g mouse on`,鼠标点选分屏、滚轮翻页全开。
最后算笔账:学会 tmux 大约花你 20 分钟,但它治好的,是「SSH 断一次、重跑一晚上」这种反复出现的隐性成本。凡是会在远程跑超过 10 分钟的任务,先 `tmux new -s` 再开工——这是我踩过坑之后,雷打不动的一条铁律。
- 点赞
- 收藏
- 关注作者
评论(0)