ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

byobu: tmux 的豪华壳

byobu: tmux 的豪华壳 1. byobu 到底是个啥一句话byobu 不是又一个终端复用器它是 tmux / GNU screen 之上的增强套件。终端复用器tmux、screen解决的是SSH 断了会话不丢、一个终端开多窗格、后台进程不被logout杀掉。但 tmux 上手有门槛——Ctrl-b前缀、手写.tmux.conf、状态栏默认空白。byobu 把这层全部藏起来给你一套开箱即用的体验会说话的状态栏负载、内存、磁盘、CPU 频率、时间…… 每秒刷新直接显示系统状况F 键快捷键F2开新窗口、F3/F4切换、F9打开配置菜单鼠标点点就能改配置双后端同一套配置风格底层 tmux 和 screen 随你切换它由 Canonical 的 Dustin Kirkland 开发曾是 Ubuntu 服务器的默认标配。2. 安装Debian 系一行装完$sudoaptinstallbyobu看版本和依赖$ byobu--versionbyobu version7.15$ dpkg-l|awk$1ii ($2~/(^byobu$|^tmux$|^screen$)/) {print $2, $3}byobu7.15-1screen4.9.1-3.1 tmux3.6a-2注意一个关键事实byobu 自己不做终端复用它只是 tmux/screen 的管家。后端选谁看/etc/byobu/backend$cat/etc/byobu/backend# BYOBU_BACKEND can currently be screen or tmux# Override this on a per-user basis by editing $BYOBU_CONFIG_DIR/backend# or by launching either byobu-screen or byobu-tmux instead of byobu.BYOBU_BACKENDtmuxBYOBU_BACKENDtmux—— 本机默认 tmux 后端。想切 screen跑byobu-select-backend或直接byobu-screen。3. 命令族全景30 多个脚本/usr/bin/byobu*是一整个家族$ls/usr/bin/byobu* byobu byobu-janitor byobu-quiet byobu-config byobu-keybindings byobu-reconnect-sockets byobu-ctrl-a byobu-launch byobu-screen -byobu byobu-disable byobu-launcher byobu-select-backend byobu-disable-prompt byobu-launcher-install byobu-select-profile byobu-enable byobu-launcher-uninstall byobu-select-session byobu-enable-prompt byobu-layout byobu-shell byobu-export byobu-prompt byobu-silent byobu-status byobu-status-detail byobu-tmux -byobu byobu-ugraph byobu-ulevel主程序/usr/bin/byobu只有 10KB是个sh -e包装脚本byobu-tmux、byobu-screen只是指向它的符号链接靠$0的名字区分派发。每个子命令各管一摊命令作用byobu-tmux/byobu-screen指定后端启动byobu-status拼装状态栏核心byobu-janitor每次启动前管家式重建用户配置byobu-configF9 交互配置菜单Python snackbyobu-select-backend切换 tmux / screenbyobu-enable/-disable开关登录自动拉起byobu-select-session已有会话多时选择要附加哪个4. 第一次真正跑起来有 TTY 时直接byobu进入无 TTY 环境也能起一个分离会话tmux 派生的好处$ byobu-tmux new-session-d-sfresh $ tmuxlsfresh:1windows(created Mon Aug3100:31:142026)这时已经能看到状态栏配置长什么样了——直接问 tmux 要$ tmux show-options-g-vstatus-left# 左侧#(byobu-status tmux_left)$ tmux show-options-g-vstatus-right# 右侧#(byobu-status tmux_right)%Y-%m-%d %H:%M:%S$ tmux show-options-g-vprefix# 前缀键F12两个关键点前缀键是F12不是 tmux 的Ctrl-b也不是 screen 的Ctrl-abyobu 也兼容Ctrl-a。状态栏根本不是写死的文本是#(byobu-status ...)这个 shell 命令替换——tmux 每秒执行一次把输出当状态栏。5. 核心状态栏是怎么拼出来的byobu-status是本片的主角。手动跑一下能看到它输出的原材料tmux 格式串 ANSI 颜色$ byobu-status tmux_left#[default]#[fgbrightwhite,bold,bgblack][B]#[default]#[fg#EEEEEE,bg#333333] #[default]#[fgbold]2026.1#[default]#[fg#EEEEEE]#[bg#333333]$ byobu-status tmux_right#[default]#[fgblue,bgwhite]8h5m#[default]#[fg#EEEEEE]#[bg#333333] #[default]#[fgblack,bgbrightyellow]0.64#[default]...3.2...GHz...7.7...GB...32...%...79...GB...44...%把 tmux 格式串翻译成人话实际看到的状态栏是[B] 2026.1 │ 8h5m 0.64 8x 3.2GHz 7.7GB/32% 79GB/44% │ 2026-08-31 00:31:09 └logo └版本 └开机时长└负载└核心数└CPU频率 └── 内存 ── └─── 磁盘 ── └─ 日期时间每个小段都是一个独立的状态脚本。/usr/lib/byobu/里躺着 40 多个$ls/usr/lib/byobu/ apport cpu_count entropy ip_address packages services time_utc arch cpu_freq fan_speed load_average processes session trash battery cpu_temphostnamelogo raid swap updates_available color custom mail memory reboot_requiredtimeuptimecpu_... disk... menu...byobu-status读两份点菜单决定渲染哪些/usr/share/byobu/status/status以#开头的是禁用$cat/usr/share/byobu/status/status|awk/(^tmux_left|^tmux_right)/tmux_leftlogo #distro release #arch sessiontmux_right#network #disk_io #custom #entropy raid reboot_required updates_available #apport #services #mail #users uptime #fan_speed #cpu_temp #battery #wifi_quality #processes #packages load_average cpu_count cpu_freq memory #swap disk #whoami #hostname #ip_address #time_utc date time所以左侧渲染logo release右侧渲染uptime load_average cpu_count cpu_freq memory disk date time。这就是为什么没看到 raid、reboot_required——它们要么被#禁用要么当前系统没有对应数据。6. 状态脚本怎么工作底层 · 一拿load_average开刀。它不调任何外部命令直接读/proc$cat/usr/lib/byobu/load_average__load_average(){if[-r/proc/loadavg];thenreadone five fifteen other/proc/loadavg# ← 内核文件elif[$BYOBU_OSTYPEOpenBSD];thenread-rone five fifteenEOF$(sysctl-nvm.loadavg2/dev/null|awk{print $2, $3, $4})EOFelseone$(uptime|sed-es/.*://|awk{print $1})fi[-n$one]||returnif[${LOAD_AVERAGES:-1}3][-n$five][-n$fifteen];thencolor Y k;printf%s %s %s$one$five$fifteen;color --# ← 上色elsecolor Y k;printf%s$one;color --fi}套路是统一的读/proc→color函数包一层 ANSI → printf。color是/usr/lib/byobu/include/colors提供的配色助手color Y k 黄字黑底。7. 配置体系双层目录 自动生成底层 · 二byobu 的配置分两层系统默认/usr/share/byobu/{profiles,keybindings,status}/用户配置~/.byobu/如果不存在就落到$XDG_CONFIG_HOME/byobu本机是~/.config/byobu用户目录不是手写的是byobu-janitor自动生成的。每次跑 byobu 都先执行byobu-janitor --force它把系统模板 用户在 F9 菜单里的选择合写成用户配置。实测首跑后生成的全套文件$ls~/.config/byobu/ backend datetime.tmux profile shellinit.tmux statusrc color keybindings profile.tmux status windows color.tmux keybindings.tmux prompt .tmux.conf运行时缓存走 tmpfs性能优先在/dev/shm/byobu-$USER-*定义在include/dirs# dirs: 配置目录 → ~/.byobu 或 ~/.config/byobu# 运行目录 → /dev/shm/byobu-$USER-* 找不到就退回 ~/.cache/byobu8. tmux 后端的加载链底层 · 三byobu-tmux实际执行的命令是主脚本尾部exectmux-u$SCREEN_TERM-f$BYOBU_PREFIX/share/byobu/profiles/tmuxrc$即tmux -f tmuxrc用一个专门的文件取代默认的~/.tmux.conf。tmuxrc是一个串联器$cat/usr/share/byobu/profiles/tmuxrc|awk/source-file/source-file$BYOBU_CONFIG_DIR/color.tmux source-file$BYOBU_CONFIG_DIR/datetime.tmux source-file$BYOBU_CONFIG_DIR/profile.tmux source-file$BYOBU_CONFIG_DIR/keybindings.tmux source-file$BYOBU_CONFIG_DIR/.tmux.conf source-file$BYOBU_CONFIG_DIR/shellinit.tmuxprofile.tmux只干一件事——把锅甩给真正的公共配置$cat~/.config/byobu/profile.tmuxsource$BYOBU_PREFIX/share/byobu/profiles/tmux真正的profiles/tmux79 行里才有干货set -g prefix F12、mode-keys vi、history-limit 100000、状态栏那两行set -g status-left/right以及把你的.tmux.conf位置留给$BYOBU_CONFIG_DIR/.tmux.conf。这里有个容易踩的坑byobu 默认完全不读你手写的~/.tmux.conf你以前在~/.tmux.conf里配的主题、插件比如 catppuccin进 byobu 后全部不生效。自定义要写进~/.config/byobu/.tmux.conf。9. 按键绑定F 键速查byobu 的按键定义在/usr/share/byobu/keybindings/f-keys.tmux一条bind-key -n对应一个 F 键。-n表示免前缀直接按就行。核心几条实测文件内容$cat/usr/share/byobu/keybindings/f-keys.tmux|awk$1bind-key $2-n {print $3}|head-30F1# 帮助help 窗口F2# 新窗口C-F2# 垂直分屏S-F2# 水平分屏F3/F4# 上一个/下一个窗口F5# 重新加载配置F6# 分离并登出F7# 进入滚动历史copy-modeF8# 重命名窗口F9# 打开 byobu-config 配置菜单F12# 前缀键转义S-F12# 开关全部 F 键绑定M-F12# 开关鼠标支持C-S-F12# Mondrian 换色艺术家附体官方帮助文件按Shift-F1是完整的速查表摘录一部分$cat/usr/share/doc/byobu/help.tmux.txt|sed-n/^ F[0-9]/pF1 * Used by X11 * Shift-F1 Display thishelpF2 Create a new window Shift-F2 Create a horizontalsplitCtrl-F2 Create a verticalsplitCtrl-Shift-F2 Create a new session F3/F4 Move focus among windows... F5 Reload profile, refresh status Shift-F5 Toggle through status lines Ctrl-Shift-F5 Change status bars color randomly F6 Detach session and then logout Shift-F6 Detach session and do not logout F7 Enter scrollback history F8 Rename the current window F9 Launch byobu-config window F12 Escape sequence Shift-F12 Toggle on/off Byobus keybindings10. 自定义状态项~/.byobu/bin/机制不想改 Python、不想碰 tmux 配置也能加自己的状态项——扔一个可执行脚本进$BYOBU_CONFIG_DIR/bin/命名NNN_name。NNN是刷新频率秒。/usr/lib/byobu/custom里的循环逻辑foriin$BYOBU_CONFIG_DIR/bin/[0-9]*_*;do[-x$i]||continue# 可执行script${i##*/}freq${script%%_*}# 300_name → 300 秒lastrun$(cat$cache.$script.last2/dev/null||echo0)[$(date%s)-ge$((lastrunfreq))]$i$cache.$script# 到点才重跑readfile$cache.$scriptoutput$output$strdone例加一个显示当前 git 分支的状态项$cat~/.config/byobu/bin/60_branchEOF #!/bin/sh # 只在 git 仓库里显示分支 git rev-parse --abbrev-ref HEAD 2/dev/null echo on $(git rev-parse --abbrev-ref HEAD 2/dev/null) EOF$chmodx ~/.config/byobu/bin/60_branch $ byobu-status tmux_right# 60 秒内最多重跑一次结果被缓存11. SSH 登录自动拉起byobu 能让你一 SSH 进来就自动进入 byobu。钩子在/etc/profile.d/Z97-byobu.shif[$LC_BYOBU0];thentrueelif[$LC_BYOBU1];then./usr/bin/byobu-launch# 显式要求elif[-e/etc/byobu/autolaunch];then./usr/bin/byobu-launch# 系统级开关elif[$LC_TERMTYPEbyobu];then./usr/bin/byobu-launch# SSH 客户端声明fi它借用了 SSH 会透传的LC_*环境变量要么你本地export LC_BYOBU1要么服务器上放/etc/byobu/autolaunch要么 SSH 客户端设LC_TERMTYPEbyobu。跑一次byobu-enable就会调用byobu-launcher-install把这些写进你的~/.bashrcbyobu-disable撤销。12. F9 配置菜单底层 · 四byobu-config是个 1KB 的 shell 包装真正的菜单是 Python 写的$cat/usr/bin/byobu-config|tail-3...PKGbyobu[-z${BYOBU_PREFIX}]exportBYOBU_PREFIX/usr||exportBYOBU_PREFIX.${BYOBU_PREFIX}/lib/${PKG}/include/common${BYOBU_PYTHON}${BYOBU_PREFIX}/lib/${PKG}/include/config.pyconfig.py基于snacknewt 的 Python 绑定做全屏菜单。它做的都是改配置文件的活勾选状态项 → 写status选主题颜色 → 写color调状态栏方案 → 写statusrc。改完按F5或让 janitor 重跑生效——所以你所有~/.config/byobu/下的文件都能删了重建byobu 会按菜单选择重新生成。13. 实测踩过的坑坑一同 server 全局选项会串台。我在一个已有 tmux server 上建 byobu 会话时状态栏一度变成 catppuccin 的status-right而不是#(byobu-status ...)——因为 tmux 的set -g全局选项是 server 级的先起的probe会话普通 tmux 你的~/.tmux.conf污染了后建的 byobu 会话。换一个干净的 servertmux kill-server后byobu 状态栏才正常出现。坑二主题不生效。本机~/.tmux.conf配了 catppuccin 主题但 byobu 用-f tmuxrc接管后完全不读它状态栏回到 byobu 默认的#333333黑灰配色。要恢复个性化去~/.config/byobu/.tmux.confbyobu 自己的里补。坑三screen 后端也要同一套。状态脚本和键绑定分tmux/screen两份f-keys.tmux与f-keys.screen切后端后F5重新加载即可不必手改配置。14. 一张图看懂全链路SSH 登录 │ /etc/profile.d/Z97-byobu.sh 命中 LC_BYOBU / autolaunch ▼ byobush 包装器 │ byobu-janitor --force 重建 ~/.config/byobu/* ▼ exec tmux -u -f /usr/share/byobu/profiles/tmuxrc new-session ... │ tmuxrc 串联: color.tmux → profile.tmux → keybindings.tmux → .tmux.conf ▼ profile.tmux 设好: prefixF12, mode-keysvi, status-left#(byobu-status tmux_left) │ tmux 每秒执行一次 #(...) 命令替换 ▼ byobu-status 读 status 点菜单 → 逐个跑 /usr/lib/byobu/item │ 每个脚本读 /proc → color 上色 → printf 片段 ▼ 渲染: [B] 2026.1 │ 8h5m 0.64 8x 3.2GHz 7.7GB/32% 79GB/44% │ 2026-08-31 00:31:09结语byobu 的价值不在它自己而在包装tmux 是引擎byobu 是座舱。状态栏由 40 多个读/proc的小脚本 一条#()命令替换撑起来配置由 janitor 按模板自动生成、F9 菜单点选即改按键用一套 F 键覆盖了 tmux 的九成高频操作。理解了壳脚本 → tmux 配置 → 状态脚本这条加载链你就既会用 byobu也能随时掀开盖子回到原生 tmux。要是哪天它跟你较劲记住三把钥匙tmux kill-server清场、F5重载配置、Shift-F12临时交还按键。
返回列表