ディスク使用率が90%を超えると自動的に電子メールアラートを送信し、95%を超えると2番目の電子メールアラートを送信するスクリプトをサーバーに実装したいと思います。私のファイルシステムはabc:/xyz/abc
およびマウントポイントは/pqr
。
私はこれを試しました:
ADMIN="[email protected]"
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
mail -s "Alert: Almost out of disk space $usep" $ADMIN
fi
done
しかし、私は言うエラーが出ます
line 7: [: Use: integer expression expected
このエラーは、-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
%dを使用してprintをprintfに変更すると、パーセンテージは整数になります。試してください:
printf("%d", $5);
91%を91に変換します。最後のコマンドは次のとおりです。
df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
上記の英語のコマンド: "人間が読める形式でディスク領域の使用状況を取得します。grepを使用して、表示するディスクにフィルターをかけます。その行をawkにパイプし、スペースで区切られた5番目の単語を出力します(空を削除)、結果の文字列を整数としてフォーマットします。私にとって、コマンドは整数78
を返します。これは、ディスクが78%使用されていることを意味します。
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
df | tail +2
最初の2行をスキップしてすべての出力を取得しますsed s/%//g
パーセント記号を取り除きますawk ...
出力の5番目のフィールドが90より大きい場合、「アラート...」を出力しますこれが私の変種です:
#!/bin/bash
[email protected]
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
echo $usep
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
echo "Alert: Almost out of disk space $usep"
df -H | mail -s "Alert: out of disk space $usep" $ADMIN
fi
done
上記のGillesの回答についてコメントすることはできませんが、awkが2番目の部分で文字列ベースの比較を行っていることに注意してください。
$5 >= ALERT
1桁のしきい値をテストしているときに、このことに気付きました。 +0を使用してキャストを強制的にintにできるため、比較は次のようになります。
$5+0 >= ALERT