文章

用 tmux-resurrect 和 tmux-continuum 持久化 Tmux 工作区

一次围绕 Tmux 重启后如何恢复 session 结构的实践记录:理解边界、安装插件、配置自动保存,并明确恢复流程。

用 tmux-resurrect 和 tmux-continuum 持久化 Tmux 工作区
  1. 问题:重启后还能 attach 吗
  2. 可恢复的不是进程,而是工作区结构
  3. 已安装的插件与配置
  4. 重启后怎么恢复
  5. 和 systemd 的边界
  6. 完整 ~/.tmux.conf 配置

问题:重启后还能 attach 吗

Tmux 的 session 存在于 tmux server 进程里。机器重启后,tmux server、session、window、pane 以及其中运行的进程都会消失,所以原来的 session 不能再通过 tmux attach 找回来。

tmux attach 只能连接仍然存在的 session。如果重启后执行:

1
tmux ls

看到 no server running,就说明原来的 tmux server 已经没了。这时能做的不是 attach,而是重新创建工作区,或者依赖提前配置好的持久化插件恢复工作区结构。

可恢复的不是进程,而是工作区结构

这次选择的方案是 tmux-resurrecttmux-continuum

它们能恢复的核心对象是:

  • session 名称
  • window 名称和顺序
  • pane 布局
  • 每个 pane 的当前目录
  • 一部分可安全重启的命令

它们不能恢复真正的进程内存状态,例如 SSH 连接、REPL 里的临时变量、正在跑到一半的任务、没有写入文件的输出。更准确地说,这套方案恢复的是“工作台”,不是“虚拟机快照”。

flowchart TD
  A[机器重启] --> B[tmux server 消失]
  B --> C{是否有持久化快照}
  C -->|没有| D[重新创建<br/>session]
  C -->|有| E[恢复 session<br/>window / pane / cwd]
  E --> F[手动重启<br/>必要命令]

  style A fill:#ffe3e3,color:#1f2937
  style B fill:#ffe3e3,color:#1f2937
  style C fill:#fff3bf,color:#1f2937
  style E fill:#e3f2fd,color:#1f2937
  style F fill:#e8f5e9,color:#1f2937

已安装的插件与配置

本机已经安装了 Tmux Plugin Manager:

1
~/.tmux/plugins/tpm

并通过它安装了:

  • tmux-resurrect
  • tmux-continuum

当前 ~/.tmux.conf 末尾追加了如下配置:

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'

set -g @continuum-save-interval '15'
set -g @continuum-restore 'on'

set -g @resurrect-processes 'vim nvim less man tail'

run '~/.tmux/plugins/tpm/tpm'

这里的关键点有三个:

  • @continuum-save-interval '15':每 15 分钟自动保存一次 tmux 工作区。
  • @continuum-restore 'on':tmux server 启动时自动恢复最近一次保存的工作区。
  • @resurrect-processes:只保守恢复 vimnvimlessmantail 这类程序,避免把复杂服务误当成可随意恢复的进程。

快照实际保存目录是:

1
~/.local/share/tmux/resurrect/

其中 last 会指向最近一次保存的快照文件。

重启后怎么恢复

重启后,通常直接启动 tmux 即可:

1
tmux

因为已经启用了 @continuum-restore 'on',第一次启动 tmux server 时会尝试自动恢复最近一次保存的工作区。

如果没有自动恢复,进入 tmux 后手动执行恢复快捷键:

1
Ctrl-b  Ctrl-r

手动保存当前状态则是:

1
Ctrl-b  Ctrl-s

如果恢复后想确认有哪些 session:

1
tmux ls

再按需 attach:

1
tmux attach -t <session-name>

和 systemd 的边界

Tmux 持久化适合恢复开发环境的布局,例如一个项目里固定有 editor、server、git、notes 几个窗口。它让人重启后快速回到熟悉的工作区。

但长期运行服务不应该依赖 tmux 恢复。比如博客预览、后台 worker、数据库、监控脚本等,更适合交给 systemd 或专门的进程管理器。Tmux 负责“工作区”,systemd 负责“服务”。

最终的实践原则是:把 tmux 当成工作台快照,把重要任务写成可重入脚本,日志落盘,真正的后台服务交给服务管理器。这样即使机器重启,也能以最小成本恢复工作现场。

完整 ~/.tmux.conf 配置

以下是本机当前使用的完整 tmux 配置,每行都加了注释说明用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 设置 prefix 键为 Ctrl-b(tmux 默认值,保持不变)
set -g prefix C-b

# prefix + r:重载配置文件,并在状态栏弹出提示
bind r source-file ~/.tmux.conf \; display "Configuration Reloaded!"

# prefix + h/j/k/l:仿 vim 方向键在 pane 之间移动(同时保留原有的方向键支持)
bind-key h select-pane -L
bind-key j select-pane -D
bind-key k select-pane -U
bind-key l select-pane -R

# prefix + Ctrl-l:快速切换到上一个 window
bind-key C-l select-window -l

# 根据当前运行的命令自动更新 window 名称
set-window-option -g automatic-rename on
# 同步更新终端标题栏(让 terminal emulator 的标题也跟着变)
set-option -g set-titles on

# copy-mode 下使用 vi 风格按键(j/k 翻行、/ 搜索等)
setw -g mode-keys vi
# 启用鼠标支持:可点击切换 pane/window,滚轮可翻页
set -g mouse on

# prefix + v:左右分割当前 pane(vertical split)
bind-key v split-window -h
# prefix + s:上下分割当前 pane(horizontal split)
bind-key s split-window -v

# prefix + ":上下分割,继承当前 pane 的工作目录
bind '"' split-window -c "#{pane_current_path}"
# prefix + %:左右分割,继承当前 pane 的工作目录
bind % split-window -h -c "#{pane_current_path}"
# prefix + c:新建 window,继承当前 pane 的工作目录
bind c new-window -c "#{pane_current_path}"

# 状态栏背景色
set -g status-bg black
# 状态栏文字颜色
set -g status-fg yellow
# 以下三行已注释,若需要高亮当前 window 标签可按需启用
#set -g window-status-current-bg white
#set -g window-status-current-fg black
#set -g window-status-current-attr bold
# 状态栏刷新间隔(秒)
set -g status-interval 60
# 状态栏左侧最大显示宽度
set -g status-left-length 60
# 状态栏左侧:红色显示 session 名,后跟当前用户名
set -g status-left '#[fg=red](#S) #(whoami)'
# 状态栏右侧:黄色显示系统 1/5/15 分钟负载均值,绿色显示当前时间
set -g status-right '#[fg=yellow]#(cut -d " " -f 1-3 /proc/loadavg)#[default] #[fg=green]%H:%M#[default]'

# 加载 TPM(Tmux Plugin Manager)本身
set -g @plugin 'tmux-plugins/tpm'
# 加载 tmux-resurrect:提供手动保存(prefix + Ctrl-s)和恢复(prefix + Ctrl-r)
set -g @plugin 'tmux-plugins/tmux-resurrect'
# 加载 tmux-continuum:在 resurrect 基础上增加自动定时保存
set -g @plugin 'tmux-plugins/tmux-continuum'

# 每 15 分钟自动保存一次工作区快照到 ~/.local/share/tmux/resurrect/
set -g @continuum-save-interval '15'
# tmux server 启动时自动恢复最近一次保存的工作区
set -g @continuum-restore 'on'

# 恢复时只重启这几个安全的轻量命令;复杂服务应显式重启,不靠 resurrect 代劳
set -g @resurrect-processes 'vim nvim less man tail'

# 必须放在最后一行:引导 TPM 初始化并加载所有已声明的插件
run '~/.tmux/plugins/tpm/tpm'
本文由作者按照 CC BY 4.0 进行授权