인수 중 하나 -ge
가 숫자 가 아니기 때문에 오류가 발생했습니다 . $ALERT
항상 숫자 이므로 $usep
범인이어야합니다. 숫자가 아닌 dh
결과 를 구문 분석하는 방법에는 몇 가지 문제점 이 있습니다 $usep
.
파일 시스템의 길이에 따라 dh
출력을 여러 줄로 나눌 수 있습니다. 필터에서 부분 라인이 포착되어 넌센스 데이터가 생성됩니다. 이 동작을 피하고에서 구문 분석 가능한 출력을 얻으려면 옵션을 dh
전달하십시오 -P
.
또한 df
헤더 라인을 인쇄하여 다시 말도 안되는 데이터를 만듭니다.
필터가 매우 복잡합니다. 나는 awk의 단일 패스를 사용합니다. 그 문제에 대해 awk 내부의 백분율을 필터링 할 수는 있지만 다음 스크립트에서는 수행하지 않았습니다.
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
NR==1
첫 줄이므로 일치 NR==1 {next}
첫번째 라인을 건너. 다음 몇 줄은 일부 파일 시스템을 제외합니다 (설명에서는 관심이 abc:/xyz/pqr
있지만 코드에서 제외한다고 설명합니다). 마지막 awk 행은 %
백분율 열을 인쇄하기 전에 백분율 열에서 제거 합니다.
모든 파일 시스템에 대해 하나의 메일을 보내는 것이 좋습니다. 이번에는 모든 분석을 awk로하고 있습니다.
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi