내 서버 중 하나에서 메모리 모듈에 오류가 발생하면 이벤트 로그에 잘못된 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을 누락으로 출력합니다.