tmux:让长任务在断线之后还活着

米阳 2024-5-11 11 5/11

SSH 断线导致备份脚本被杀、部署中断、数据导入重来——这类事在 tmux 面前都不存在。它不新,但确实是服务器上最该先学会的工具之一。

基本操作

tmux 的默认前缀键是 Ctrl+b,所有命令都是「先按前缀,再按命令键」。

tmux new -s work      # 新建名为 work 的会话
tmux ls               # 列出会话
tmux attach -t work   # 重新接入
tmux kill-session -t work

断线之后重新登录,tmux attach 就能回到原来的画面,命令还在跑,输出还在那里。

窗口和面板

Ctrl+b c     新建窗口
Ctrl+b n/p   下一个/上一个窗口
Ctrl+b 0-9   跳到指定窗口
Ctrl+b ,     重命名窗口
Ctrl+b %     左右分屏
Ctrl+b "     上下分屏
Ctrl+b 方向键 切换面板
Ctrl+b z     当前面板全屏/还原
Ctrl+b d     脱离会话(detach)

我的常用布局是一个窗口跑日志(docker compose logs -f),一个窗口跑命令,一个窗口开着编辑器。分屏看日志和命令输出对照,比来回切换快很多。

为什么不用 nohup

nohup cmd & 也能让进程在断线后继续跑,但有几个问题:

  • 输出只能重定向到文件,想看实时输出要 tail,看不到当时的完整上下文
  • 无法交互——需要输入的内容就没法处理
  • 进程管理全靠 ps 和 kill,容易杀错

tmux 里是完整的终端会话,可以交互、可以回看滚动缓冲、可以随时介入。

保活的实际场景

数据迁移:

tmux new -s migrate
# 在里面执行
mysqldump ... | mysql ...
# Ctrl+b d 脱离,去干别的

长时间编译或模型训练:同理,脱离之后关掉电脑都不影响。

多人协作看同一个会话:tmux attach -t work 可以让两个人看到同一个终端,排查问题时特别有用——你敲命令,对方实时看到结果。

几个配置

~/.tmux.conf:

set -g mouse on
set -g history-limit 10000
setw -g mode-keys vi
bind r source-file ~/.tmux.conf \; display "reloaded"

mouse on 支持鼠标滚轮和点击切面板,history-limit 加大滚动缓冲,默认只有 2000 行,看日志不够。

注意

tmux 会话在服务器重启后会消失。要开机自动恢复,得用 tmux-resurrect 这类插件,或者干脆把服务交给 systemd。tmux 适合「临时但重要」的任务,长期服务还是 systemd 更合适。

- THE END -

米阳

5月11日10:15

最后修改:2024年5月11日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论