私のサーバーの1つでメモリモジュールに障害が発生すると、イベントログに誤った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では空で、もう一方のCPUでは空ではないDIMMスロットをチェックするプログラムを探しています。私はこれを行うために次のような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を欠落として出力します。