如何为Tmux状态栏各脚本设置不同的status-interval更新间隔?
Tmux状态栏多脚本差异化更新间隔实现方案
核心需求
- 用三个脚本在Tmux状态栏右侧展示内容:
sysload.sh:系统负载systemp.sh:CPU/GPU/HDD温度weather.sh:调用OpenWeatherMap API获取天气
- 更新间隔要求:
- 系统负载、硬件温度每5秒更新一次
- 天气每10分钟(600秒)更新一次,减少API调用次数
- 原全局
status-interval 60会强制整个状态栏每分钟更新,无法满足不同脚本的更新频率要求
原配置代码
set -g status-interval 60 ...rest of statusline codes... set -g status-right "#[fg=green,bg=default,bright]#($HOME/.config/tmux/sysload.sh)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=pink3,bg=default,bright]#($HOME/.config/tmux/systemp.sh)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=#7aa2f7,bg=default,bright]#($HOME/.config/tmux/weather.sh)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=#565f89,bg=default]%b %d (%a) %H:%M#[default]"
无效的尝试方案
曾尝试删掉全局status-interval,给每个脚本加--interval参数,但Tmux本身不支持这种方式,无法实现差异化更新:
set -g status-right "#[fg=green,bg=default,bright]#($HOME/.config/tmux/sysload.sh --interval 5)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=pink3,bg=default,bright]#($HOME/.config/tmux/systemp.sh --interval 5)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=#7aa2f7,bg=default,bright]#($HOME/.config/tmux/weather.sh --interval 600)" set -ag status-right "#[fg=grey80,bg=default,bright] | " set -ag status-right "#[fg=#565f89,bg=default]%b %d (%a) %H:%M#[default]"
可行解决方案:脚本内部缓存
实现思路
Tmux的全局status-interval控制整个状态栏的更新频率,所以先把全局间隔设为最快的5秒,满足系统负载和温度的更新需求;然后在weather.sh里添加缓存逻辑,让它只在间隔超过10分钟时才调用API,否则直接输出缓存内容。
具体步骤
- 修改全局
status-interval:
set -g status-interval 5
- 给
weather.sh添加缓存功能,示例代码:
#!/bin/bash # 缓存文件路径,可自行调整 CACHE_FILE="$HOME/.cache/tmux_weather.cache" # 更新间隔:10分钟=600秒 UPDATE_INTERVAL=600 # 检查缓存是否有效 if [ -f "$CACHE_FILE" ]; then LAST_UPDATE=$(stat -c %Y "$CACHE_FILE") CURRENT_TIME=$(date +%s) if [ $((CURRENT_TIME - LAST_UPDATE)) -lt $UPDATE_INTERVAL ]; then # 缓存未过期,直接输出 cat "$CACHE_FILE" exit 0 fi fi # 缓存过期或不存在,调用API获取新数据 # 替换成你的OpenWeatherMap API调用逻辑,这里只是示例 WEATHER_INFO=$(curl -s "https://api.openweathermap.org/data/2.5/weather?q=你的城市&appid=你的API密钥" | jq -r '.weather[0].main + " " + (.main.temp | tostring) + "°C"') # 更新缓存并输出结果 echo "$WEATHER_INFO" > "$CACHE_FILE" echo "$WEATHER_INFO"
- 保持状态栏的脚本调用配置不变即可,和原配置一致。
内容的提问来源于stack exchange,提问作者Manojit
相关产品推荐
相关产品推荐

