用 tmux 在远程服务器跑长时 AI 任务
在远程 Linux 机器上跑模型下载、数据预处理或推理批处理,最尴尬的情况是任务跑到一半,本地网络抖动,SSH 连接断开,进程跟着被终止。日志停在半截,模型缓存写了一半,只能重来。解决办法不复杂:把任务放进 tmux 会话里跑,连接断了任务还在。
先说清楚 tmux 解决什么问题。它提供终端复用,会话独立于 SSH 连接存在。断开后重新连上服务器,执行 tmux attach 就能回到原来的界面,看到任务继续输出。但它不解决机器重启:服务器一重启,tmux 会话同样消失。需要开机自启和崩溃恢复,仍然要用 systemd;tmux 适合的是“这次任务要跑几个小时,别被断网打断”。
安装很简单,主流发行版的软件源里都有,装完执行 tmux new -s train 创建名为 train 的会话。进去后先激活虚拟环境,再启动任务,并把输出同时写到日志文件:
bash
source /opt/ai-tool/venv/bin/activate
python train .py 2>&1 | tee -a /opt/ai-tool/logs/train.log
按 Ctrl+b 再按 d 脱离会话,任务继续在后台运行。之后用 tmux ls 查看会话列表,用 tmux attach -t train 重新接入。如果只是想确认进度,也可以不接入,直接 tail -f 那个日志文件。
几个容易踩的坑。第一,会话里不会自动继承你登录 shell 的全部环境,尤其是通过某些跳板或 sudo 切换用户时,虚拟环境、CUDA 路径、代理变量都可能缺失,最好在启动命令前显式 source 或 export。第二,tmux 默认回滚行数有限,任务输出几万行后往上翻看不到早期内容,建议一开始就把输出 tee 到文件,而不是依赖终端回滚。第三,一个会话可以开多个窗口,比如一个窗口跑训练、一个窗口用 nvidia-smi 或 top 看资源、一个窗口看日志,用 Ctrl+b c 新建窗口、Ctrl+b n 切换,比开多个 SSH 连接清楚。第四,别在 tmux 里跑需要交互确认的脚本然后人走开,卡在提示符上等于白等,长时任务应加上非交互参数或提前确认好。
如果任务只需要“断开后继续”,不需要回头交互,nohup 加输出重定向也能做到,但排查问题时看不到实时界面,也不方便中途进容器或切换目录。tmux 的优势是保留一个可操作的工作现场。入门阶段建议养成习惯:凡是预计超过几分钟的远程任务,先进 tmux,再启动,顺手 tee 日志。这样断网、换设备、第二天回来,接上就能继续看,任务不会因为一次连接抖动而前功尽弃。
- 点赞
- 收藏
- 关注作者
评论(0)