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

在Conky中使用awk while循环处理多段BOINC任务数据的问题

解决Conky中Boinccmd多任务数据提取的自适应方案

问题场景

需要在Conky脚本中解析boinccmd --get_tasks的输出,提取每段任务的WU name、project URL、estimated CPU time remaining和fraction done字段并格式化输出。现有代码只能处理单段任务,需重复编写n次代码适配不同线程数,无法自适应任务数量。

解决方案

利用Awk的分段触发逻辑,以任务段的分隔线(如1) -----------)为节点,每遇到新任务段就输出上一段的收集结果,再重置变量收集当前段数据,实现自适应多任务解析。

Conky脚本代码

${execi 60 boinccmd --get_tasks | awk -F': |://|/' '\
# 匹配新任务段分隔线,输出上一段数据并重置变量
/^[0-9]+) -----------/ {
    if (u != "" && w != "" && p != "" && e != "") {
        printf "%.10s %.18s %3.1f %s\n", u, w, p*100, e
    }
    u = w = p = e = ""
    next
}
# 提取项目URL的域名部分
/project URL/ { u = $3 }
# 提取WU名称
/WU name/ { w = $2 }
# 提取完成进度比例
/fraction done/ { p = $2 }
# 计算并格式化剩余时间
/estimated CPU time remaining/ { e = strftime("%d/%m %Hh%M", $2 + systime()) }
# 输出最后一段任务数据
END {
    if (u != "" && w != "" && p != "" && e != "") {
        printf "%.10s %.18s %3.1f %s\n", u, w, p*100, e
    }
}\
'}

代码说明

  • 分段触发逻辑:通过匹配^[0-9]+) -----------识别新任务段,若已收集到上一段完整数据则先格式化输出,再清空变量准备收集当前段。
  • 字段提取:沿用原分隔规则提取对应字段:
    • 项目URL分割后取第3段(域名部分)
    • WU名称取分割后的第2段
    • 完成比例直接取数值部分,后续转成百分比
    • 剩余时间将秒数加到当前系统时间上,格式化为日/月 时h分
  • 收尾处理:在END块中输出最后一段任务数据,避免遗漏。

输入输出示例

  • 输入(boinccmd --get_tasks输出片段):
1) -----------
   name: wu_1664392603_228876_0
   WU name: wu_1664392603_228876
   project URL: https://boinc.loda-lang.org/loda/
   fraction done: 0.809
   estimated CPU time remaining: 3600
   ...
2) -----------
   name: wu_1664392603_228908_0
   WU name: wu_1664392603_228908
   project URL: https://boinc.loda-lang.org/loda/
   fraction done: 0.807
   estimated CPU time remaining: 7200
   ...
  • 输出(Conky中显示的格式化内容):
boinc.loda wu_1664392603_2288 80.9 07/10 01h37
boinc.loda wu_1664392603_2289 80.7 07/10 02h38

内容的提问来源于stack exchange,提问作者Guillaume J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:25:24