用 tmux 管理远程会话的入门实践
~~远程连上服务器跑一个耗时任务,最怕的是网络一抖、笔记本一合盖,会话就断了,跑到一半的程序也跟着没了。我以前的办法是把命令丢进后台加 nohup,事后翻日志,但进程一多就分不清谁是谁。后来改用 tmux:它把终端会话和 SSH 连接解耦,断线了会话还在,重新连上就能接着看,管理起来也直观得多。这篇把我日常的用法整理出来。
先理解 tmux 在管什么
tmux 里有三层概念:会话(session)、窗口(window)、窗格(pane)。一个会话就是一个独立的工作现场,里面可以开多个窗口,每个窗口又能切成多个窗格。会话即使没人看着也在服务器上跑着,断开 SSH 只是把“显示器”拔掉,里面的程序不受影响。
装起来很简单,大多数发行版自带包管理器就能装:
sudo apt install tmux # Debian / Ubuntu
sudo dnf install tmux # Fedora / RHEL 系
装好后直接敲 tmux 就进了一个新会话。默认前缀键是 Ctrl+b,之后再按一个键发指令,比如 Ctrl+b d 是脱离会话(detach),Ctrl+b c 是新建窗口。刚开始记不住很正常,我只先记脱离和重连这两个就够用了。
日常最常用的四个动作
新建一个有名字的会话,名字要见名知意,比如按任务起名:
tmux new -s backup
跑耗时任务时就待在这个会话里。合上电脑之前按 Ctrl+b d 脱离,会话留在服务器上继续跑。下次连上服务器,用下面这条回来:
tmux attach -t backup
如果手头会话多了,先列出来再挑:
tmux ls
输出里每行一个会话,带着创建时间与窗口数,一眼就能找到要回的那个。不再需要的会话用 tmux kill-session -t backup 清掉,避免僵尸会话越攒越多。
窗口与窗格:一个会话里并行干活
只用一个会话跑一个任务是浪费。我的习惯是一个项目一个会话,会话里分窗口:一个窗口跑服务日志,一个窗口写代码,一个窗口跑测试。Ctrl+b c 新建窗口,Ctrl+b n 切下一个,Ctrl+b p 切上一个,Ctrl+b 数字 直接跳到指定窗口。
一个窗口里还要左右对照时就切窗格:Ctrl+b % 左右分,Ctrl+b " 上下分,Ctrl+b 方向键 在窗格之间移动。左边看日志、右边改配置的场景特别顺手,省得开两个 SSH 再来回切。
断线重连与多设备接力
tmux 真正值钱的地方在断线之后。SSH 断了、WiFi 换了、电脑重启了,只要服务器没重启,会话都在。重新 SSH 上去 tmux attach,之前跑的输出、停的位置都在,日志不用重新翻。
我经常在两台设备之间接力:办公室电脑上开会话跑备份,回家在笔记本上 attach 继续看进度。两个人一起看一个会话也行,一个 attach 上去,另一个用 tmux attach -t 目标会话 就能同屏,排查问题时不用再截图发来发去。
几个我踩过的坑
一是会话名别用中文和空格,纯英文加横杠最稳,脚本里引用也不会出错。二是 tmux ls 报错“no server running”不代表任务丢了,往往是当前用户不对——会话属于创建它的那个用户,换用户是看不到的。三是服务器重启会清空所有会话,真正不能断的长期任务还是要交给 systemd 管理,tmux 管的是“人要看着的交互任务”,不是守护进程。四是退出会话里最后一个程序时会话会自动消失,exit 之前先确认长任务是不是已经转后台交给了别的方式。
一份极简配置
默认的 Ctrl+b 按起来有点别扭,状态栏也比较素。我在 ~/.tmux.conf 里只放了三行,够用就不再折腾:
set -g mouse on
set -g history-limit 20000
setw -g mode-keys vi
第一行让鼠标能点选窗格、拖动边框,第二行把滚动回看的历史加到两万行,第三行让复制模式用 vi 的键位。改完配置后,在会话里按 Ctrl+b : 输入 source-file ~/.tmux.conf 就生效,不用重启会话。
小结
tmux 的入门门槛只有三个命令:新建、脱离、重连。把它当成“不会因为断线而消失的终端”来用,先从给每个长任务单独建一个会话开始,跑稳一周,再逐步用上窗口和窗格。等你第一次在断线重连后看到任务还在原地跑、输出一行没少,就会明白它为什么是远程运维的标配。~~
- 点赞
- 收藏
- 关注作者
评论(0)