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 掉线后重连)

  1. 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 使用教程

  • 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
  • 关闭会话:在会话中输入 exittmux kill-session -t 会话名

总结

  1. 核心原因:当前终端已处于 tmux 会话中($TMUX 变量存在),tmux 阻止嵌套启动新会话。
  2. 优先解决方案:执行 exit 退出当前 tmux 会话,再重新运行 tmux.exe
  3. 特殊场景:必须嵌套时用 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 选项是布尔型(开/关),必须指定 onoff,只写 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 ...绑定鼠标滚轮向下:选中当前窗格 → 触发向下滚动事件(无需复制模式)

第四步:验证配置是否生效

修复后按以下步骤验证,确保无报错:

  1. 保存修正后的配置到 /c/Users/Administrator/.tmux.conf
  2. 验证效果:
    • 鼠标能点击切换窗格、拖动调整窗格大小;
    • 滚轮能上下滚动查看终端历史输出;
    • 无任何 unknown commandserver exited unexpectedly 报错。

重新加载配置并启动 tmux:

tmux source /c/Users/Administrator/.tmux.conf tmux.exe 

先杀掉可能崩溃的 tmux 进程:

tmux kill-server 

总结

  1. 核心错误:setw -g mouse 缺少 on,导致 tmux 解析配置时识别为无效命令,是服务器崩溃的主要原因;
  2. 其他要点:你的滚轮绑定逻辑正确,仅需补全鼠标选项的 on 即可正常使用;
  3. 关键验证:修复后执行 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 行。

总结

  1. 核心原因:.tmux.confsend-keys 命令语法错误(缺参数/参数错位/无发送内容),导致 tmux 解析失败、服务器意外退出。
  2. 修复关键:检查配置文件中所有 send-keys 行,按 send-keys [参数] 要发送的内容 格式修正,确保参数完整、顺序正确。
  3. 验证方法:先通过 tmux -f /dev/null 确认 tmux 本身可用,再修复配置文件,重启 tmux 验证是否正常运行。

Read more

会提问的人,正在用AI收割下一个十年

会提问的人,正在用AI收割下一个十年

文章目录 * 引言:一场关于AI的颠覆性对话 * 从对话到收入:AI时代的新型生产关系 * 会说话就能赚钱?这不是天方夜谭 * 从想法到产品:三天的魔法 * 技术民主化:AI不再是工程师的专属 * 打破技术壁垒的革命 * 文科生的优势在哪里? * AI时代的商业逻辑:用户付费意愿超预期 * 价值认知的转变 * 为什么用户愿意付费? * 新的商业模式 * AI的边界:思考仍然是人类的专属 * 技术的局限性 * 人机协作的最佳模式 * 实践指南:如何开始你的AI创作之旅 * 第一步:转变思维方式 * 第二步:从小项目开始 * 第三步:快速迭代 * 第四步:关注用户价值 * 第五步:建立商业模式 * 《脉向AI》:探索AI时代的无限可能 * 为什么要关注这期访谈? * 这不仅仅是一次访谈 * 结语:属于每个人的AI时代 引言:一场关于AI的颠覆性对话 在这个技术迅猛发展的时代,我们总是习惯性地认为,掌握AI技术是程序员和工程师的专属特权。但如果我告诉你,文科生可能才是A

By Ne0inhk

Windows安装mamba全流程(全网最稳定最成功)

windows系统下安装mamba会遇到各种各样的问题。博主试了好几天,把能踩的坑都踩了,总结出了在windows下安装mamba的一套方法,已经给实验室的windows服务器都装上了。只要跟着我的流程走下来,大概率不会出问题,如果遇到其他问题,可以在评论区讨论,我会的我会回复。 主要的流程步骤是参考这篇文章,并对其中遇到的问题进行改进。 首先创建mamba的环境,然后安装必要的库。请你创建一个新环境,而不是用以前的环境,版本这些就跟着这个里面来。 conda create -n your_env_name python=3.10.13 conda activate your_env_name conda install cudatoolkit==11.8-c nvidia pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.

By Ne0inhk
【Linux:文件 + 进程】进程间通信进阶(1)

【Linux:文件 + 进程】进程间通信进阶(1)

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 1 ~> 准备阶段:进程间通信的概念 * 1.1 是什么(本质前提) * 1.2 为什么 * 1.3 怎么办 * 1.4 思维导图 * 2 ~> 进程间通信 * 2.1 进程间通信的定制标准:System V * 2.2 进程间通信的发展 * 3

By Ne0inhk