【tmux入门】终端分屏、SSH远程守护与一键启动脚本

前言

  • 最近项目中有不少使用 Windows 的朋友在困扰于 cmd终端无法很好地进行分屏操作的问题。
  • 同时,在通过 SSH 远程执行任务时,一旦连接断开,正在运行的程序也会随之中断;而如果将任务放到后台运行,又难以及时查看输出日志。
  • 本文将介绍一个终端工具 ------ tmux,用来解决上述问题。

1 tmux基础

1-1 介绍
  • tmux(terminal multiplexer)是一款终端复用工具,它允许用户在一个终端窗口中同时管理多个会话(session)、窗口(window)和面板(pane)。
  • 简单来说,tmux 可以让你在一个 SSH 连接或本地终端中"开多个终端",并且这些终端互不干扰、可独立运行。

1-2 优势介绍
  • tmux 的核心优势在于"会话与终端解耦"。它在后台维护一个独立的 session,即使 SSH 连接断开,session 仍然在服务器上持续运行,因此程序不会被终止。重新连接后,可以直接恢复到原来的工作状态。
  • 在分屏方面,tmux 通过在同一个 session 内创建多个 window 和 pane,实现类似 IDE 的多窗口布局,本质上是对同一个终端会话的复用与划分,而不是启动多个独立终端进程。
  • 因此,tmux 既解决了远程任务"断线即停"的问题,也提供了灵活的终端分屏与管理能力。

1-3 基础名词解释
  • tmux 采用三级结构组织终端:
bash 复制代码
Session(会话)
│
├── Window(窗口)
│   ├── Pane(面板)
│   ├── Pane(面板)
│   └── Pane(面板)
│
├── Window(窗口)
│   ├── Pane(面板)
│   └── Pane(面板)
│
└── Window(窗口)
    └── Pane(面板)
  1. 会话(Session)
    • Session 是 tmux 的最顶层单位,可以理解为一个独立的工作空间。
    • 一个 Session 中可以包含多个 Window。
    • 即使 SSH 连接断开,Session 仍然会在后台继续运行。
    • 重新连接服务器后,可以通过 attach 重新进入该 Session。
  2. 窗口(Window)
    • Window 类似于浏览器中的标签页(Tab)。
    • 一个 Session 可以拥有多个 Window。
    • 每个 Window 默认包含一个 Pane。
    • 不同 Window 之间互相独立,可以运行不同任务。
  3. 面板(Pane)
    • Pane 是 tmux 中最小的显示单元。
    • 一个 Window 可以被划分为多个 Pane。
    • 每个 Pane 都拥有独立的 Shell 和进程环境。
    • 可以理解为终端的分屏区域。
  • 你可以这么理解:
tmux 类比
Session 一个 VSCode 工程
Window 一个标签页(Tab)
Pane 标签页中的分屏终端
复制代码
Session
    └── Window
            └── Pane
  • 通常开发时,一个项目对应一个 Session;不同功能模块放在不同 Window 中;而需要同时观察多个程序时,则使用 Pane 进行分屏。
  • 每个 pane = 一个独立 tty + shell + 进程组

1-4 安装
  • Linux可以直接通过apt源下载
bash 复制代码
sudo apt update
sudo apt install tmux -y
  • 下载后直接在终端输入
bash 复制代码
tmux
  • 退出(如果只是把窗口关掉,tmux仍会继续在后台运行)
bash 复制代码
exit

  • 注:1-6会教学进行更为方便的鼠标和快捷键设置,下属1-5为基础指令,可以直接跳到1-6
1-5 tmux 常用指令(初学者建议直接到1-5)
  1. 基础会话管理
bash 复制代码
tmux new -s session_name      # 创建新会话
tmux ls                       # 查看所有会话
tmux attach -t session_name   # 进入已有会话 如果只有一个会话可以直接tmux attach
tmux detach                   # 从当前会话退出(会话继续后台运行)
tmux kill-session -t name     # 关闭指定会话

  1. 窗口(window)操作(tmux内)
bash 复制代码
Ctrl + b c      # 创建新窗口
Ctrl + b n      # 下一个窗口
Ctrl + b p      # 上一个窗口
Ctrl + b w      # 列出所有窗口
Ctrl + b ,      # 重命名当前窗口
Ctrl + b &      # 关闭当前窗口

  1. 面板(pane)分屏
bash 复制代码
Ctrl + b "      # 上下分屏
Ctrl + b %      # 左右分屏
Ctrl + b o      # 切换面板
Ctrl + b x      # 关闭当前面板
Ctrl + b z      # 当前面板全屏/还原

  1. 常用技巧
bash 复制代码
Ctrl + b d      # detach 当前会话(后台运行)
Ctrl + b ?      # 查看帮助

1-6 自定义配置
  • 初次使用tmux且之前没怎么使用过vim或者vi的朋友可能会tmux无鼠标的基础操作吓哭了(不是)
  • 好消息我们可以通过设置tmux的自定义配置让tmux更接近我们平常使用的终端
  • 我们直接打开tmux的配置文件,没有配置的可以自行创建:
bash 复制代码
touch ~/.tmux.conf
  • 我们添加如下内容:
bash 复制代码
set -g mouse on # 开启鼠标
bind -n MouseDown2Pane choose-window # 鼠标左键选择窗口
bind | split-window -h # 左右分屏
bind - split-window -v # 上下分屏
bind Space next-layout # 更改布局
bind y setw synchronize-panes # 窗口间同步输入
bind x confirm-before -p "kill-pane #P? (y/n)" kill-pane # 关闭面板
bind X confirm-before -p "kill-window #W? (y/n)" kill-window # 关闭窗口
  • 然后我们可以刷新配置文件
bash 复制代码
tmux source-file ~/.tmux.conf

1-7 自定义配置基础操作
  • 打开一个tmux终端
bash 复制代码
tmux
  • 根据上述的配置文件,我们有如下基础操作:

1-7-1 鼠标操作
  • 由于启用了鼠标操作,下面的所有操作都可以配合鼠标完成

  • 鼠标左键可以正常访问不同窗口

  • 鼠标拖动窗口边栏可以伸缩

  • 长按鼠标右键可以呼出菜单

    • swap up:将当前 Pane 与上一个 Pane 交换位置。
    • swap down:将当前 Pane 与下一个 Pane 交换位置。
    • swap marked:与被标记(marked)的 Pane 交换位置。
    • kill:关闭当前 Pane(相当于ctrl+b x
    • respawn:重新创建(重生)当前 Pane。
    • mark:标记当前 Pane。
    • zoom:当前 Pane 最大化。

1-7-1 左右分屏
  • 请注意这里的|对应在键盘上的按键是需要同时按下shift
bash 复制代码
Ctrl + b,然后按 |

1-7-2 上下分屏幕
bash 复制代码
Ctrl + b,然后按 -

1-7-3 快速切换
  • 配合方向按键上下左右可以随意切换窗口
bash 复制代码
Ctrl + b,然后按下方向键

1-7-3 同步输入
  • 当前打开的所有窗口都会同步输入一样的内容:
    • 再次按下ctrl +b y取消同步输入
bash 复制代码
Ctrl + b,然后按 y

1-7-4 关闭当前窗口(此关闭不会后台运行)
  • 关闭面板需要提示:
bash 复制代码
Ctrl + b,然后按 x

1-7-4 后台运行
  • 将关闭当前session,并切换至后台
bash 复制代码
Ctrl + b,然后按 D
  • 快速切换回去:(如果只有一个窗口)
bash 复制代码
tmux a # 或者tmux attach
  • 如果有多个:
bash 复制代码
tmux attach -t session_name

1-7-5 复制
  • tmux的复制相对于平常的终端较为复杂,这里只讲解最简单的方案:
  1. 需要复制到终端外的
bash 复制代码
shift+鼠标拖动选中
ctrl+shift+c             # 复制
ctrl+shift+v 或者 ctrl+v  # 粘贴
  1. 终端内复制
bash 复制代码
ctrl+b [ # 复制
鼠标选中
ctrl+b ] # 粘贴
  1. 也可以配合插件和~/.tmux.conf设置更多功能,这里暂不赘述

2 自动脚本

2-1 一键启动脚本
  • 利用好tmux的特性,我们可以写成自动化脚本执行所有程序
bash 复制代码
#!/bin/bash

SESSION="dev"

COMMANDS=(
    "echo 0"
    "echo 1"
    "echo 2"
    "echo 3"
    "echo 4"
    "echo 5"
)

# 删除旧 session
tmux kill-session -t "$SESSION" 2>/dev/null


# 创建新 session
tmux new-session -d -s "$SESSION"

# 构建 2列 × 3行布局
P0=$(tmux list-panes -t "$SESSION:0" -F "#{pane_id}")

P3=$(tmux split-window -t "$P0" -h -P -F "#{pane_id}")

P1=$(tmux split-window -t "$P0" -v -P -F "#{pane_id}")
P2=$(tmux split-window -t "$P1" -v -P -F "#{pane_id}")

P4=$(tmux split-window -t "$P3" -v -P -F "#{pane_id}")
P5=$(tmux split-window -t "$P4" -v -P -F "#{pane_id}")


PANES=("$P0" "$P1" "$P2" "$P3" "$P4" "$P5")

# 自动绑定命令
for i in "${!PANES[@]}"; do
    tmux send-keys -t "${PANES[$i]}" "${COMMANDS[$i]}" C-m
done

# 进入 session
tmux attach -t "$SESSION"
  • 赋予上述脚本执行权限
bash 复制代码
chmod +x ./bringup.sh
  • 启动
bash 复制代码
./bringup.sh

总结

  • 本文介绍了tmux的基础指令,以及如何通过自定义配置让tmux更好用,最后介绍了tmux一键启动多个终端的脚本。
  • 如有错误,欢迎指出!
  • 感谢你的观看!
相关推荐
月巴月巴白勺合鸟月半1 小时前
在Linux下开发桌面程序
linux·运维·服务器
qq_163135751 小时前
Linux 【03-pwd命令超详细教程】
linux
学途路漫漫1 小时前
Ubuntu 24.04 国内网络环境全面优化指南
linux·网络·ubuntu
c238561 小时前
GDB 进程概念详解(下篇)—— 多进程与进阶调试能力
linux·服务器·数据库
RisunJan1 小时前
Linux命令-php(PHP语言的命令行接口)
linux·php
A_humble_scholar1 小时前
Linux(八) 进程内存全景:环境变量、main 函数参数与虚拟地址空间全链路深度解析
linux·运维·服务器
遇见小修修1 小时前
如何找到专业的电脑上门维修供应商?
运维·电脑·负载均衡
longforus1 小时前
linux上播放音乐的终极解决方案
linux·音频·折腾
xcLeigh1 小时前
鸿蒙PC平台 Shotwell 照片管理器适配实战:从 Linux GNOME 到 鸿蒙PC 的 Electron 迁移
linux·electron·harmonyos·鸿蒙·shotwell·照片管理器