エラーは、-ge
数値ではないという引数の1つが原因です。$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