ディスク容量が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%を比較します。 10 GB未満の一部のディスクサイズは、90%未満のディスク使用量にとって重要ではない場合があります。

アップデート1:

GNU bash、バージョン 4.2.46(2)-リリース(x86_64-redhat-linux-gnu)

オペレーティングシステムはセントース7です

現在のコードの問題:

2番目の行の列を最後の行と比較する必要がありますが、現在のコードが最初の行の列を比較しているため動作しないようです。問題を解決するには?

答え1

現在のコードの問題は、df -Hの出力が常にGB単位ではないことです。

ここへの答えは使用しないことです-H。文書で説明されているように、man dfこれは「人間が読める出力」として意図されており、単位は意図的に変更される可能性があります。

代わりに、固定単位(デフォルトのKBまたはMB(-m))を使用してください。

Nagios(Icinga)についても知りたいかもしれません。これは、現在扱っている監視タイプを正確に処理するためのスクリプトを含む監視ツールです。

スクリプトを実行すると、常にディスクがいっぱいであるという出力が表示されます。

これは、スクリプトの実行中にエラー(ファイルが見つからない、構文エラーなど)が発生した場合、またはスクリプトがゼロ以外の特定の状態で終了しない限り、常に正常に終了するため、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

関連情報