使用Awk统计SLURM作业分配CPU总数时结果不符的问题排查
SLURM CPU总数计算结果错误的排查
我尝试从SLURM的scontrol --details --oneliner show job输出中获取作业分配的CPU总数。CPU ID格式为逗号分隔的列表,可能包含连字符分隔的范围。测试输入为0,2-11,48-58,预期计算结果为22,但运行以下代码后得到40:
echo 0,2-11,48-58 | awk ' { cpus = 0; m = split($0, arr, ","); for (j = 1; j <= m; j++) cpus += ( idx = index(arr[j], "-") \ ? 1 + substr(arr[j], idx+1) - substr(arr[j], 1, idx-1) \ : 1 \ ); print cpus } '
输出结果:
40
使用的GNU Awk版本为4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)。
问题根源
代码中的循环条件j <= m使用了HTML转义字符<,而非实际的小于等于符号<=。GNU Awk无法识别<作为比较运算符,会将其视为字符串进行处理,导致循环判断逻辑完全错误——循环不会按预期终止,甚至重复计算数组元素,最终得到错误的CPU总数。
修复方案
将<=替换为实际的<=符号,修改后的代码如下:
echo 0,2-11,48-58 | awk ' { cpus = 0; m = split($0, arr, ","); for (j = 1; j <= m; j++) cpus += ( idx = index(arr[j], "-") \ ? 1 + substr(arr[j], idx+1) - substr(arr[j], 1, idx-1) \ : 1 \ ); print cpus } '
运行后会得到正确结果:
22
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

