SSH 进服务器干活,断开连接任务就中断了,用 tmux 可以解决这个问题。顺便整理一下常用操作。

安装

# Arch Linux
sudo pacman -S tmux

# Debian/Ubuntu
sudo apt install tmux

核心概念

Session(会话)
  └── Window(窗口)
        └── Pane(窗格)
  • Session:一个独立的工作空间,断开 SSH 后依然在后台运行
  • Window:Session 里的标签页
  • Pane:Window 里的分割区域

前缀键

tmux 所有快捷键都要先按前缀键,默认是 Ctrl + b。后面用 <prefix> 表示。

Session 操作

# 新建 session
tmux
tmux new -s work          # 指定名称

# 查看所有 session
tmux ls

# 接入 session(断开后重连)
tmux attach
tmux attach -t work       # 接入指定 session

# 在 tmux 内分离(不关闭,后台运行)
<prefix> d

# 重命名 session
<prefix> $

# 关闭 session
tmux kill-session -t work

Window 操作

<prefix> c     新建窗口
<prefix> w     列出所有窗口
<prefix> n     下一个窗口
<prefix> p     上一个窗口
<prefix> 0-9   跳转到指定编号的窗口
<prefix> ,     重命名当前窗口
<prefix> &     关闭当前窗口

Pane 操作

<prefix> %     垂直分割(左右)
<prefix> "     水平分割(上下)
<prefix> 方向键  切换 pane
<prefix> z     最大化/恢复当前 pane
<prefix> x     关闭当前 pane
<prefix> {     把当前 pane 向左移动
<prefix> }     把当前 pane 向右移动

调整 pane 大小:按住 <prefix> 不放,再按方向键。

复制模式

<prefix> [      进入复制模式
空格             开始选择
Enter           复制选中内容
<prefix> ]      粘贴
q               退出复制模式

基础配置

默认配置用起来有点别扭,~/.tmux.conf 里改几个常用设置:

# 把前缀键改为 Ctrl+a(更顺手)
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix

# 用 | 和 - 分割,比 % 和 " 直观
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %

# 鼠标支持(可以用鼠标切换 pane、调整大小)
set -g mouse on

# 让颜色显示正常
set -g default-terminal "screen-256color"

# 窗口编号从 1 开始
set -g base-index 1
setw -g pane-base-index 1

# 修改配置后重新加载
bind r source-file ~/.tmux.conf \; display "配置已重新加载"

修改后在 tmux 内执行 <prefix> r 重载配置(如果已经加了那条 bind)。

常用场景

在服务器上跑耗时任务:

tmux new -s build
# 开始编译...
# Ctrl+b d 分离,关掉终端
# 之后 tmux attach -t build 重新接入查看进度

多任务并行:

<prefix> %    左右分成两个 pane
左边跑日志:tail -f /var/log/nginx/error.log
右边继续操作

用熟了之后很难离开,特别是远程连接服务器的时候。