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

Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 arcane_helper_utils 的鸿蒙化适配指南 - 实现具备通用逻辑增强与多维开发脚手架的实用工具集、支持端侧业务开发的效率倍增实战 前言 在进行 Flutter for OpenHarmony 开发时,如何快速处理常见的字符串格式化、色值转换、日期计算或布尔值增强?虽然每一个功能都很小,但如果每个项目都重复造轮子,开发效率将大打折扣。arcane_helper_utils 是一款专注于极致实用的“瑞士军刀”型工具集。本文将探讨如何在鸿蒙端通过这类高内聚的 Utility 集实现极致、丝滑的业务交付。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过对 Dart 原生类型(Object, String, List, Map, Bool)

By Ne0inhk
用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

执行git clone https://github.com/openclaw/openclaw克隆项目,执行cd openclaw进入项目 执行node --version看看node的版本是否大于等于22(没有node.js需自行安装),再执行npm install -g pnpm安装作为包管理器,并执行pnpm install安装依赖 首次执行pnpm ui:build构建 Web UI(会先安装 ui/ 目录的依赖) 执行pnpm build构建主程序 执行pnpm openclaw onboard --install-daemon运行配置向导(安装守护进程),完成初始化 按键盘右箭头选择Yes,同样Yes 任选一个模型提供商都行,没有对应的提供商的密钥可以跳过,如果是本地模型选vLLM(需用vLLM框架启动模型,有性能优势,但原生vLLM仅完全支持Linux的cuda)、Custom Provider(可以连接任何 OpenAI 或 Anthropic 兼容的端点,

By Ne0inhk

Modelsim仿真软件的,安装/破解/使用教程大全

仿真前言         作为一名FPGA工程师,在做FPGA开发时,使用仿真一定是最重要的,有些人喜欢写完代码直接上板子调试,根本不会做一点点仿真;如果是简单的逻辑代码,有十足的把握,那就不用仿真,可以直接上板子调试,但是,如果您是在做工程的开发,很多代码都是第一次编写调试,那么,代码的仿真是一定要做的,你要问我为啥,我个人觉得,每次把自己写完的代码,放到modelsim上面仿真看一下波形,就像考试的时候,拿着参考答案在做题一样的感觉,各个波形的变化你都会看的一清二楚,但是如果你用在线逻辑分析仪看RTL的仿真,那真的是太耗费时间;         我知道这个时候就会有人说了,Modelsima仿真有啥用呀,和下板子调试完全是两个概念,包括信号延迟,信号质量,眼图等都不一样,说的也对,但是实际情况是,这些人眼高手低,觉得仿真这种操作太麻烦;仿真虽然不能完全模拟真实的硬件信号,硬件延迟也没法准确仿真,但是他能让你在开发的时候,规避掉95%的因为代码引起的错误,这会让你在调试阶段节省很多时间;然后剩下的调试你必须 要在硬件调试时才会发现并且解决;        在调试阶段,FPGA为

By Ne0inhk
FPGA入门:CAN总线原理与Verilog代码详解

FPGA入门:CAN总线原理与Verilog代码详解

目录 一、CAN 总线核心原理 1. 物理层特性 2. 协议层核心概念 (1)位时序 (2)帧结构(标准数据帧) (3)关键机制 二、FPGA 实现 CAN 的核心模块 三、Verilog 代码实现(以 50MHz 时钟、1Mbps 波特率为例) 1. 全局参数定义 2. 位时序模块(CAN Bit Timing Generator) 3. CRC 计算模块(CAN CRC Generator) 4. 发送模块(CAN Transmitter) 5. 接收模块(CAN Receiver)

By Ne0inhk