You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据进程运行状态在tmux状态栏显示指定字符串

解决tmux状态栏自定义程序状态显示问题

你遇到的核心问题是:tmux的内部条件表达式(比如#{?}、#{!=})是在配置加载阶段解析的,而#()是每次状态栏更新时才执行外部命令,两者执行顺序不匹配,导致你没法直接用内部判断来处理外部脚本的输出。下面给你两种可行的解决方案:

方法一:修改getPid脚本直接返回目标字符串(最简单)

既然tmux的内部判断没法对接外部命令的运行时结果,不如把判断逻辑直接写到getPid脚本里,让它直接输出你要显示的内容或空字符串:

  1. 修改你的getPid脚本(假设原来的逻辑是检测进程p是否存在):
    #!/bin/bash
    # 检测进程p是否运行(这里可以替换成你原来的检测逻辑)
    if pgrep -x "p" > /dev/null; then
        echo "program"  # 进程运行时显示的自定义字符串
    else
        echo ""         # 进程未运行时输出空
    fi
    
  2. 更新tmux配置的status-right:
    set -g status-right : #(getPid p)
    

这样tmux每次更新状态栏时,直接显示脚本的输出结果,完美避开内部判断的限制。

方法二:用后台定时任务动态更新自定义变量(适合不想改脚本的情况)

如果不想修改getPid脚本,可以通过tmux的后台任务定时检测进程状态,更新一个自定义变量,再在状态栏引用这个变量:

  1. 在tmux配置里初始化自定义变量:
    set -g @program_status ""
    
  2. 添加后台运行的检测脚本(每2秒检查一次,可调整sleep时间):
    run-shell -b 'while true; do
        # 调用你的getPid脚本,判断结果是否非0
        if [ "$(getPid p)" != "0" ]; then
            tmux set-option -g @program_status "program"
        else
            tmux set-option -g @program_status ""
        fi
        sleep 2
    done'
    
    -b参数让脚本在后台运行,不会阻塞tmux启动。
  3. 在status-right里引用这个变量:
    set -g status-right : #{@program_status}
    

验证生效

修改完配置后,重新加载tmux配置:

tmux source-file ~/.tmux.conf

然后运行/关闭目标程序,看看状态栏是否正确显示自定义字符串。

内容的提问来源于stack exchange,提问作者vesperto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:19:29