当我的一台服务器中的内存模块出现故障时,事件日志通常会报告错误的 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 怪物来完成此任务,但我确信有一种更简单的方法可以使用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
答案1
此 AWK 脚本使用标准输入上给出的内容或作为要处理的文件来查找丢失的 DIMM:
!/Size:/ {
cpu = substr($3, 1, 2)
dimm = substr($3, 4)
missing[cpu] = missing[cpu] " " dimm
}
END {
for (cpu in missing) {
split(missing[cpu], dimms, " ")
for (key in dimms) {
for (cmpcpu in missing) {
if (cpu != cmpcpu && missing[cmpcpu] !~ dimms[key]) {
print cpu "-" dimms[key]
}
}
}
}
}
它将缺失的 DIMM 输出到其标准输出。
该脚本的工作原理是列出没有“大小”的行,为每个 CPU 构建一串缺失的 DIMM。然后,它处理每个 CPU,将丢失的 DIMM 字符串分开,并在其他 CPU 的丢失 DIMM 列表中查找每个单独的 DIMM;如果无法匹配(至少与另一个 CPU 匹配),则会将 DIMM 输出为缺失。