tmux 会话保持的正确用法:detach、命名会话与远程协作不掉线
用 SSH 登录服务器跑一个三小时的数据清洗脚本,中途笔记本合盖或网络抖动,连接一断,前台进程就随着 SSH 会话一起被 SIGHUP 杀掉了。这个问题的根源在于:终端关闭时,内核会把前台进程组里的所有进程终止。tmux 的价值就是把「会话」和「终端视图」解耦——进程跑在服务端常驻的 tmux server 里,SSH 断开只是断开了视图,会话和进程都还在。重新连上后 attach 回去,一切原样。下面按我自己每天在用的顺序,把最小可用流程和几个容易被忽略的细节整理成一篇速查。一、最小可用流程。新建一个命名会话:tmux new -s work(-s 后面是会话名)。临时离开时按 Ctrl-b 再按 d(detach),会话转入后台,可以放心断开 SSH。回来后先看有哪些会话:tmux ls,再接回去:tmux attach -t work。如果 ls 显示的是 0、1、2 这种默认编号,说明建会话时没有命名——名字本身就是标签,隔几天回来还能一眼认出哪个是爬虫、哪个是编译,强烈建议从第一天就养成 new -s 的习惯。二、几个容易被忽略的细节。1)同一会话默认互踢:两个人(或两个终端窗口)同时 attach 同一个会话,tmux 会把先前的连接挤掉,窗口尺寸也会跟着最新的客户端走。想两个人看同一块屏幕做结对排障,用 tmux new-session -t work -s work-share 以「会话组」方式共享,而不是直接 attach。2)服务器重启后会话不会恢复:tmux 只保证会话在 server 进程存活期间有效,机器重启一切清零。跨重启的长期任务要交给 systemd(写个 unit 配 Restart=always),tmux 负责「断线不掉」,systemd 负责「挂了自愈」,两者别混为一谈。3)清理死会话:试验完的会话及时 tmux kill-session -t work,避免 ls 里堆一排僵尸;找不到哪个占着端口,可以用 tmux list-panes -a -F '#{session_name} #{pane_current_command} #{pane_pid}' 快速盘点。三、分屏与回滚,两个最常用的操作。分屏:Ctrl-b % 左右分屏,Ctrl-b " 上下分屏,Ctrl-b 方向键在窗格间切换。回滚:Ctrl-b [ 进入 copy/滚动模式,方向键或 PgUp/PgDn 翻历史输出,q 退出。在 tmux 里跑长任务时日志滚得快,这个内置回滚比重新 tail 方便得多,也可以用 tmux capture-pane -p -S -200 直接把最近 200 行导出成文本存档。四、一个完整的例子。SSH 上服务器,tmux new -s etl,在里面启动 python clean.py;按 Ctrl-b d 脱离,合上笔记本回家;第二天 attach -t etl,进程还在跑,capture-pane 导出日志检查进度,结束后 kill-session 收尾。整个过程 SSH 断了几次都不影响任务。小结:tmux 解决的是「会话与终端解耦」,不解决「进程守护」与「开机自启」,后者交给 systemd。把命名会话、detach/attach、分屏回滚这三件事练熟,远程开发的稳定性会上一个台阶。
- 点赞
- 收藏
- 关注作者
评论(0)