디스크 공간이 90%를 초과하면 경고 이메일을 보내는 스크립트는 디스크가 가득 차지 않았더라도 디스크가 가득 찼음을 보냅니다. 이 문제를 해결하는 방법은 무엇입니까?

디스크 공간이 90%를 초과하면 경고 이메일을 보내는 스크립트는 디스크가 가득 차지 않았더라도 디스크가 가득 찼음을 보냅니다. 이 문제를 해결하는 방법은 무엇입니까?
#!/bin/bash

df -m > myfile
server_ip_address=$(ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | head -n 1 | awk '/inet/ {print $2}' | cut -d'/' -f1)

if awk '$2 > 10000 && $5 > 90' myfile ; then
    echo "Disk Full in $server_ip_address"
else
    echo "Nothing wrong with the server"
fi

스크립트를 실행하면 항상 디스크가 꽉 찼다고 출력됩니다. df -m의 출력은 다음과 같습니다.

Filesystem              1M-blocks   Used Available Use% Mounted on
/dev/mapper/centos-root    949305 512827    436479  55% /
devtmpfs                     3811      0      3811   0% /dev
tmpfs                        3823      0      3823   0% /dev/abc
tmpfs                        3823     18      3806   1% /run
tmpfs                        3823      0      3823   0% /sys/fs/cgroup
/dev/sda2                    1014    175       840  18% /boot
/dev/sda1                    1022     12      1011   2% /boot/efi
tmpfs                         765      0       765   0% /run/user/2000

df -m의 출력은 서버마다 다릅니다. 따라서 크기>10GB, 사용률>90%를 비교합니다. 10GB 미만의 일부 디스크 크기는 90% 미만의 디스크 사용량에 중요하지 않을 수 있습니다.

업데이트 1:

GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu)

운영체제는 센토스 7 입니다

현재 코드의 문제점:

두 번째 행의 열을 마지막 행과 비교해야 하는데 현재 코드가 첫 번째 행의 열을 비교하고 있기 때문에 작동하지 않을 것 같습니다. 문제를 해결하는 방법?

답변1

현재 코드의 문제는 df -H의 출력이 항상 GB 단위가 아니라는 것입니다.

여기에 대한 대답은 사용하지 않는 것입니다 -H. 문서에 설명된 대로 man df이는 "사람이 읽을 수 있는 출력"으로 의도되었으며 단위는 의도적으로 변경될 수 있습니다.

대신 고정 단위(기본 KB 또는 MB( -m))를 사용하십시오.

Nagios(Icinga)에 대해서도 알고 싶을 수도 있습니다. 이는 현재 다루고 있는 모니터링 유형을 정확히 처리하기 위한 스크립트가 포함된 모니터링 도구입니다.

스크립트를 실행하면 항상 디스크가 꽉 찼다는 출력이 표시됩니다.

이는 스크립트를 실행하는 동안 오류(파일을 찾을 수 없음, 구문 오류 등)가 발생하거나 스크립트가 0이 아닌 특정 상태로 종료되지 않는 한 항상 성공적으로 끝나기 if awk ...때문에 항상 true를 반환하기 때문입니다.awk


나는 이런 식으로 대본을 작성하는 것을 고려하는 경향이 있습니다.

#!/bin/sh
myIP=$(
    ip -j route |
    jq -r '.[] | select(.dst == "default") | .gateway'
)

df=$(
    df -lm -x tmpfs |
    awk '
        NR==1 { header=$0 }
        $5+0 > 90 { if (length(header)) { print header; header="" }; print }
    '
)

if [ -n "$df" ]
then
    echo "Problems with server $myIP"
    echo
    echo "$df"
else
    echo "Disk space seems ok on $myIP"
fi

관련 정보