如何根据进程运行状态在tmux状态栏显示指定字符串
解决tmux状态栏自定义程序状态显示问题
你遇到的核心问题是:tmux的内部条件表达式(比如#{?}、#{!=})是在配置加载阶段解析的,而#()是每次状态栏更新时才执行外部命令,两者执行顺序不匹配,导致你没法直接用内部判断来处理外部脚本的输出。下面给你两种可行的解决方案:
方法一:修改getPid脚本直接返回目标字符串(最简单)
既然tmux的内部判断没法对接外部命令的运行时结果,不如把判断逻辑直接写到getPid脚本里,让它直接输出你要显示的内容或空字符串:
- 修改你的
getPid脚本(假设原来的逻辑是检测进程p是否存在):#!/bin/bash # 检测进程p是否运行(这里可以替换成你原来的检测逻辑) if pgrep -x "p" > /dev/null; then echo "program" # 进程运行时显示的自定义字符串 else echo "" # 进程未运行时输出空 fi - 更新tmux配置的
status-right:set -g status-right : #(getPid p)
这样tmux每次更新状态栏时,直接显示脚本的输出结果,完美避开内部判断的限制。
方法二:用后台定时任务动态更新自定义变量(适合不想改脚本的情况)
如果不想修改getPid脚本,可以通过tmux的后台任务定时检测进程状态,更新一个自定义变量,再在状态栏引用这个变量:
- 在tmux配置里初始化自定义变量:
set -g @program_status "" - 添加后台运行的检测脚本(每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启动。 - 在
status-right里引用这个变量:set -g status-right : #{@program_status}
验证生效
修改完配置后,重新加载tmux配置:
tmux source-file ~/.tmux.conf
然后运行/关闭目标程序,看看状态栏是否正确显示自定义字符串。
内容的提问来源于stack exchange,提问作者vesperto
相关产品推荐
相关产品推荐

