tmux_for_windows windows上面安装 git bash 2026年 正是专门为了解决“SSH 掉线后还能继续原来的会话”这个问题而设计的工具
tmux_for_windows
tmux是一个开源工具,用于在一个终端窗口中运行多个终端会话。本工具从msys2里提取,可以在Git for Windows的Git Bash (MingW64)下正常使用。
蘭雅sRGB 龙芯小本服务器 | https://262235.xyz
##tmux(以及 screen)正是专门为了解决“SSH 掉线后还能继续原来的会话”这个问题而设计的工具。
简单来说:
| 工具 | SSH 掉线后还能连上原来的会话吗? | 说明 |
|---|---|---|
| 普通 bash / zsh | 不能 | 会话结束,进程收到 SIGHUP 信号,通常被杀死 |
| tmux | 能 | 会话独立于 SSH 连接存在,掉线后可以随时重新 attach |
| screen | 能 | 和 tmux 功能几乎一样,但 tmux 现在更流行、功能更强 |
| zellij | 能 | 更现代的替代品,但普及度不如 tmux |
tmux 的典型用法(SSH 掉线后重连)
- SSH 掉线了也没关系(关浏览器、断网、电脑关机都行)
如果忘记会话名字了,可以先列出所有 tmux 会话
tmux ls# 看到类似:# mytrain: 1 windows (created Tue Feb 25 19:45:12 2026) [80x24]然后再 attach 上去。
过一会儿重新 SSH 登录服务器,然后重新连上原来的 tmux 会话
tmux attach -t mytrain # 或者简写 tmux a -t mytrain 连上后,你会看到程序还在跑,输出还在继续,窗口布局、进程状态全部保留。
在 tmux 里面跑你的程序(比如训练脚本)
python standalone_warmup_with_wandb.py ... 登录服务器后,先启动一个 tmux 会话
tmux new -s mytrain # -s 后面是会话名字,随便起常用快捷键(在 tmux 里按 Ctrl+b 再按下面键)
d→ detach(脱离会话,但不关闭,程序继续跑)c→ 新建窗口n/p→ 切换下一个/上一个窗口,→ 重命名当前窗口w→ 窗口列表(鼠标或键盘选)Ctrl+b ?→ 查看所有快捷键帮助
小贴士
- 更极端的场景(怕 tmux 本身被杀)
可以再套一层nohup或用 systemd 服务,但 99% 的情况 tmux 就够用了。
如果服务器上没有 tmux,先安装:
# Ubuntu/Debiansudoapt update &&sudoaptinstall tmux -y # CentOS/RHELsudo yum install tmux -y 如果你经常用,建议把 tmux 配置得更舒服一点(~/.tmux.conf)
常见优化:
# 改前缀键为 Ctrl+a(很多人觉得比 Ctrl+b 好按)set -g prefix C-a unbind C-b bind C-a send-prefix # 鼠标支持(可选)set -g mouse on # 窗口从 1 开始编号(更直观)set -g base-index 1 setw -g pane-base-index 1总结一句话:
tmux 就是为“SSH 掉线后还能连回原来的程序”而生的,用起来非常稳。
只要你先 tmux new -s xxx 再跑训练,掉线后再 tmux a -t xxx 就能无缝接上。强烈建议你现在就试一次。
tmux在windows系统下安装使用
https://youtu.be/zSUwczhdtKI

https://github.com/yanggg1133/tmux_for_windows/
首先你要保证已经安装有 Git for Windows
下载地址 https://git-scm.com/download/win
关闭
tmux kill-session -t 会话名
tmux for Git Bash (MingW64) 安装包使用
- 下载 tmux_for_git-bash.zip
- 释放文件到 D:\Git\usr
- ** 默认是C:\Program Files\Git\usr**
- 实际可执行文件在 D:\Git\usr\bin\tmux.exe
** 默认是C:\Program Files\Git\usr\bin**
tmux 使用
- Windows 开始菜单 运行 D:\Git\git-bash.exe
- 命令行输入 tmux
git-bash环境下命令行安装
git clone https://github.com/hongwenjun/tmux_for_windows.git cd tmux_for_windows/ unzip -x tmux_for_git-bash.zip -d /usr 原始的 tmux for msys2 的安装包,不需要下载
# tmux-2.7-1 旧版本 tmux_for_windows/tmux_271 a31b2636ff7540ec11a38ac4d9c95dc9 libevent-2.1.8-1-x86_64.pkg.tar.xz a7ac01f4ccef1ecedf9ef346fb2c818e tmux-2.7-1-x86_64.pkg.tar.xz ba061b3687f77dde53658a95793e952e tmux_for_git-bash.zip # 旧版本 # tmux-3.1-c1 新版本 tmux_for_windows/tmux_311 9abfa52145cf5a7e591847f58a5253e3 libevent-2.1.12-2-x86_64.pkg.tar.zst b433f58e1267f5582de43d2e9d78d82d tmux-3.1.c-1-x86_64.pkg.tar.zst 
tmux 启用鼠标操作
.tmux.conf 设定
cd ~ vim ~/.tmux.conf # # https://www.youtube.com/watch?v=xTplsyQaGFs # tmux 启用鼠标操作 setw -g mouse set-option -g history-limit 20000 set-option -g mouse on bind -n WheelUpPane select-pane -t= \; copy-mode -e \; send-keys -M bind -n WheelDownPane select-pane -t= \; send-keys -M 

fish_for_git-bash
Fish 是"the friendly interactive shell"的简称,最大特点就是方便易用。很多其他 Shell 需要配置才有的功能,Fish 默认提供,不需要任何配置。
fish for Git Bash (MingW64) 安装包使用
- 下载 fish_for_git-bash.7z
- 释放文件到 D:\Git
- 实际可执行文件在 D:\Git\usr\bin\fish.exe
fish 使用教程
- http://fishshell.com/docs/current/tutorial.html
原始的 fish for msys2 的安装包,不需要下载
Path: tmux_for_windows/fish_312 9cb0219a335d2b54c388cbf25c2ea456 bc-1.07.1-2-x86_64.pkg.tar.xz 4fd6c824c616709966167fdc5f1a5195 fish-3.1.2-1-x86_64.pkg.tar.zst b882faf644ccd4770f7c3002e1dc6d71 groff-1.22.4-1-x86_64.pkg.tar.xz 0d78c572a6cd9f0bf88e2b0ceedf62e6 libpcre2_16-10.35-1-x86_64.pkg.tar.zst f3d45b93b85a9d57c978224bd8111c09 libpipeline-1.5.2-1-x86_64.pkg.tar.xz 4dd5d447bb0e160502afe95a1bafe044 man-db-2.9.3-1-x86_64.pkg.tar.zst 把fish设为交互式shell
如果不将fish设为默认shell,就能照常运行Bash的初始化脚本。这能够保证用户当前的环境变量不受影响并且在fish中也能使用,因为fish是作为Bash的子进程运行的。下面是几种只把fish设为交互式shell的方法。
通过.bashrc启动fish
保持默认shell为Bash不变,然后添加一行exec fish到合适的Bash配置文件中,比如.bashrc。在这种方法中,Bash会正常执行/etc/profile和/etc/profile.d中的所有配置文件。相对于之后几种方法,这种是最通用的,因为这种方法在本机计算机和SSH远程计算机上都能使用。
使用终端复用器的选项
要将fish设为tmux启动的默认shell,在~/.tmux.conf中加入这行:
set-option -g default-shell “/usr/bin/fish”
关闭问候语
默认情况下,每次启动fish,fish都会打印问候语。要关闭问候语,可以在fish中运行:
set -U fish_greeting
网页界面
通过下面命令即可用浏览器打开fish的配置页面。
fish_config
你现在遇到的这个提示 sessions should be nested with care, unset $TMUX to force,是因为你已经在一个 tmux 会话里,又尝试启动新的 tmux 会话(tmux 默认不推荐嵌套会话),所以给出了这个警告。
问题分析与解决方法
1. 先理解核心原因
$TMUX 是一个环境变量,当你处于 tmux 会话中时,这个变量会被自动设置(指向当前 tmux 会话的套接字)。tmux 检测到这个变量存在,就会阻止你直接启动新的嵌套会话,避免使用混乱。
2. 分场景解决
场景 A:你想退出当前 tmux 会话,重新启动
这是最常见的正常使用场景,步骤如下:
- 先退出当前 tmux 会话:在 tmux 窗口中输入
exit并回车,回到原生的终端界面。 - 再重新启动 tmux:执行
tmux.exe,此时就能正常创建新的 tmux 会话,不会再出现警告。
场景 B:你确实需要嵌套 tmux 会话(不推荐,仅特殊场景用)
如果有特殊需求必须嵌套(比如远程服务器里的 tmux 套本地 tmux),可以强制取消 $TMUX 变量后启动:
# 临时取消 $TMUX 变量,强制启动嵌套会话unset TMUX && tmux.exe ⚠️ 注意:嵌套会话会导致快捷键、窗格管理混乱(比如前缀键会被多层 tmux 拦截),非必要不建议这么做。
场景 C:检查是否误进入 tmux(确认当前状态)
如果你不确定自己是否在 tmux 里,可以执行以下命令验证:
# 查看 $TMUX 变量是否存在echo$TMUX# 如果输出非空(比如类似 /tmp/tmux-1000/default,5678,0),说明当前在 tmux 会话中# 如果输出为空,说明在原生终端补充:tmux 基础使用小技巧
避免后续再遇到类似问题,记住几个常用操作:
- 新建会话:
tmux new -s 会话名(比如tmux new -s mysession,方便管理多个会话) - 列出所有会话:
tmux ls - 分离会话(保留会话后台运行):按
前缀键(Ctrl+b)+d - 重新连接会话:
tmux attach -t 会话名(比如tmux attach -t mysession) - 关闭会话:在会话中输入
exit或tmux kill-session -t 会话名
总结
- 核心原因:当前终端已处于 tmux 会话中(
$TMUX变量存在),tmux 阻止嵌套启动新会话。 - 优先解决方案:执行
exit退出当前 tmux 会话,再重新运行tmux.exe。 - 特殊场景:必须嵌套时用
unset TMUX && tmux.exe强制启动(不推荐)。
你提供的这段 tmux 配置整体思路是对的(启用鼠标、调整历史行数、绑定滚轮操作),但存在两处关键语法错误,会导致 tmux 解析失败(也就是你之前遇到的服务器退出、命令报错问题),我先帮你修正,再详细解释问题和原因。
第一步:修正后的正确配置
# tmux 启用鼠标操作(兼容不同 tmux 版本) setw -g mouse on # 旧版 tmux 窗口级鼠标配置(补全缺失的 on) set-option -g history-limit 20000# 调整滚动历史行数(正确) set-option -g mouse on # 新版 tmux 全局鼠标配置(正确)# 绑定鼠标滚轮上下滚动(修正语法错误,适配 tmux 滚轮事件)bind -n WheelUpPane select-pane -t=\; copy-mode -e \; send-keys -M bind -n WheelDownPane select-pane -t=\; send-keys -M 第二步:你的配置中的核心问题分析
问题 1:setw -g mouse 语法不完整(最关键)
- 错误写法:
setw -g mouse - 问题原因:tmux 的
mouse选项是布尔型(开/关),必须指定on或off,只写mouse会被 tmux 判定为“未知命令”,直接导致配置解析失败。 - 修正:
setw -g mouse on(补全on,明确开启窗口级鼠标)。
问题 2:WheelDownPane 绑定逻辑无错误,但需注意版本兼容(非语法错,优化点)
你的 bind -n WheelDownPane 写法语法上没问题,但补充说明:
send-keys -M是 tmux 用来传递鼠标事件的指令,滚轮向下滚动时不需要进入copy-mode(向上需要),所以你的写法是合理的;- 部分新版 tmux 中
select-pane -t=可以简化为select-pane,效果一致,不影响使用。
第三步:配置解释(帮你理解每一行的作用)
| 配置行 | 作用说明 |
|---|---|
setw -g mouse on | 针对 tmux 2.1 及以下版本,开启窗口级鼠标支持(选窗格、调整大小等) |
set-option -g history-limit 20000 | 将 tmux 终端的滚动历史行数从默认(约2000)提升到20000,能滚动看更多历史输出 |
set-option -g mouse on | 针对 tmux 2.2+ 版本,开启全局鼠标支持(新版推荐写法,覆盖窗口/会话级) |
bind -n WheelUpPane ... | 绑定鼠标滚轮向上:选中当前窗格 → 进入复制模式 → 触发向上滚动事件 |
bind -n WheelDownPane ... | 绑定鼠标滚轮向下:选中当前窗格 → 触发向下滚动事件(无需复制模式) |
第四步:验证配置是否生效
修复后按以下步骤验证,确保无报错:
- 保存修正后的配置到
/c/Users/Administrator/.tmux.conf; - 验证效果:
- 鼠标能点击切换窗格、拖动调整窗格大小;
- 滚轮能上下滚动查看终端历史输出;
- 无任何
unknown command或server exited unexpectedly报错。
重新加载配置并启动 tmux:
tmux source /c/Users/Administrator/.tmux.conf tmux.exe 先杀掉可能崩溃的 tmux 进程:
tmux kill-server 总结
- 核心错误:
setw -g mouse缺少on,导致 tmux 解析配置时识别为无效命令,是服务器崩溃的主要原因; - 其他要点:你的滚轮绑定逻辑正确,仅需补全鼠标选项的
on即可正常使用; - 关键验证:修复后执行
tmux kill-server+tmux source 配置文件+tmux.exe,无报错且鼠标/滚轮功能正常即为配置生效。
如果启动后还有小问题(比如滚轮滚动不灵敏),可以告诉我你的 tmux 版本(执行 tmux -V 查看),我再帮你微调适配版本的配置。
你现在遇到的这个错误包含两个核心问题:一是 [server exited unexpectedly] 说明 tmux 服务器意外退出,二是 usage: send-keys [-FH1MRX] [-N repeat-count] [-t target-pane] key 提示你使用 send-keys 命令时格式错误,这两个问题通常是因为 .tmux.conf 配置文件里的 send-keys 命令写法不合法,导致 tmux 启动时解析失败、服务器崩溃。
问题分析与解决步骤
1. 先定位核心原因
send-keys 是 tmux 里用于向指定窗格发送按键/命令的指令,它有严格的语法要求:
- 必须指定 目标窗格(可选) 和 要发送的键/命令(必选)
- 不能有多余的字符、错位的参数,也不能缺少核心的“要发送的内容”
你的错误就是配置文件中某一行 send-keys 命令的参数/格式写错了,tmux 启动时解析失败,直接导致服务器意外退出,并抛出用法提示。
2. 具体解决步骤
步骤 1:临时跳过配置文件,验证问题根源
先启动不加载配置的 tmux,确认是配置文件的问题:
# 启动 tmux 但不加载 .tmux.conf,验证是否能正常运行 tmux -f /dev/null new-session 如果能正常进入 tmux 会话,说明确实是 .tmux.conf 里的错误配置导致的问题;如果还是报错,再检查系统环境,但99%的情况都是配置文件的问题。
步骤 2:检查并修复 .tmux.conf 中的 send-keys 命令
打开你的配置文件,找到所有包含 send-keys 的行,按正确语法修正:
# 编辑配置文件vim /c/Users/Administrator/.tmux.conf 常见错误示例 & 修正方案
| 错误写法(导致崩溃) | 正确写法(示例) | 说明 |
|---|---|---|
send-keys(无任何参数) | send-keys "ls -l"(发送命令) | 必须指定要发送的内容 |
send-keys -t 1(缺内容) | send-keys -t 1 "cd /tmp"(指定窗格+内容) | 参数不完整,缺核心的key |
send-keys "echo hello" -N(参数错位) | send-keys -N 2 "echo hello"(参数在前) | 参数要写在内容前面 |
正确的 send-keys 用法示例(可参考)
如果你的配置里想绑定快捷键并发送命令,正确写法比如:
# 示例1:绑定 F5 键,向当前窗格发送 "clear && ls" 并回车bind F5 send-keys "clear && ls" C-m # 示例2:新建窗格后,自动发送 cd 命令到新窗格bind -n C-s split-window -v \; send-keys -t bottom "cd /c/Users/Administrator" C-m # 示例3:重复发送 2 次 "hello" 到编号为 1 的窗格 send-keys -N 2 -t 1"hello"⚠️ 关键:C-m 代表“回车”,如果想让发送的命令自动执行,必须加这个;所有参数(-N/-t等)要放在“要发送的内容”前面。
步骤 3:保存并验证修复
- 保存配置文件:vim 中按
Esc→ 输入:wq回车。
重新加载配置并启动 tmux:
# 先杀掉崩溃的 tmux 服务器 tmux kill-server # 重新加载配置 tmux source /c/Users/Administrator/.tmux.conf # 启动 tmux tmux.exe 如果能正常进入 tmux 会话,说明配置已修复;如果还有报错,继续检查配置文件中其他 send-keys 行,确保没有语法错误。
3. 补充:如果找不到 send-keys 错误行
如果不确定哪一行错了,可以清空配置文件,逐行添加配置并测试,定位错误行:
# 先备份原配置cp /c/Users/Administrator/.tmux.conf /c/Users/Administrator/.tmux.conf.bak # 清空配置文件echo""> /c/Users/Administrator/.tmux.conf # 启动 tmux,确认能正常运行 tmux.exe 然后逐行把备份的配置加回去,每加一行就执行 tmux source 配置文件 测试,直到出现报错,就能精准定位错误的 send-keys 行。
总结
- 核心原因:
.tmux.conf中send-keys命令语法错误(缺参数/参数错位/无发送内容),导致 tmux 解析失败、服务器意外退出。 - 修复关键:检查配置文件中所有
send-keys行,按send-keys [参数] 要发送的内容格式修正,确保参数完整、顺序正确。 - 验证方法:先通过
tmux -f /dev/null确认 tmux 本身可用,再修复配置文件,重启 tmux 验证是否正常运行。