当我的一台服务器中的内存模块发生故障时,事件日志通常会报告错误的 DIMM 插槽或完全不存在的 DIMM 插槽。我们想出的确定故障 DIMM 的最佳方法是检查哪个 DIMM 缺失。
我有一个产生以下输出的命令:
Location Tag: P1-DIMMA1 Size: 34359738368 bytes
Location Tag: P1-DIMMA2
Location Tag: P1-DIMMB1
Location Tag: P1-DIMMC1
Location Tag: P1-DIMMD1 Size: 34359738368 bytes
Location Tag: P1-DIMMD2
Location Tag: P1-DIMME1 Size: 34359738368 bytes
Location Tag: P1-DIMMF1
Location Tag: P2-DIMMA1 Size: 34359738368 bytes
Location Tag: P2-DIMMA2
Location Tag: P2-DIMMB1 Size: 34359738368 bytes
Location Tag: P2-DIMMC1
Location Tag: P2-DIMMD1 Size: 34359738368 bytes
Location Tag: P2-DIMMD2
Location Tag: P2-DIMME1 Size: 34359738368 bytes
Location Tag: P2-DIMMF1
在此示例中,P1-DIMMB1 发生故障(该 DIMM 插槽安装在 P2 中,但未安装在 P1 中)
我正在寻找一种编程方法来确定一个 cpu 中哪些 DIMM 插槽是空的,而另一个 cpu 中没有。我想出了以下 bash monstrocity 来完成此任务,但我确信有一种更简单的方法可以使用awk
.
cpu1_dimms=()
cpu2_dimms=()
missing=()
while read -r line; do
dimm=$(awk '{print $3}' <<<"$line")
cpu=${dimm:1:1}
size=$(awk '{print $5}' <<<"$line")
if [[ -n "$size" ]]; then
case $cpu in
1) cpu1_dimms+=( "${dimm:3}" );;
2) cpu2_dimms+=( "${dimm:3}" );;
esac
fi
done < <(echo "$var")
for dimm in "${cpu1_dimms[@]}"; do
if ! [[ "${cpu2_dimms[@]}" =~ "$dimm" ]]; then
missing+=( "P2-$dimm" )
fi
done
for dimm in "${cpu2_dimms[@]}"; do
if ! [[ "${cpu1_dimms[@]}" =~ "$dimm" ]]; then
missing+=( "P1-$dimm" )
fi
done
这假设上述命令的输出存储在变量中var
此 AWK 脚本使用标准输入中给出的内容或作为要处理的文件来查找丢失的 DIMM:
它将丢失的 DIMM 输出到其标准输出。
该脚本通过列出没有“大小”的行来工作,为每个 CPU 构建一串缺失的 DIMM。然后,它处理每个 CPU,将丢失的 DIMM 字符串拆分,并在其他 CPU 的丢失 DIMM 列表中查找每个单独的 DIMM;如果它无法匹配(对于至少一个其他 CPU),它会将 DIMM 输出为缺失。