ディスク使用量が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
答え1
このエラーは、-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
答え2
%d を使用して print を printf に変更すると、パーセンテージは整数になります。努力する:
printf("%d", $5);
これは91%を91に変換します。したがって、最終コマンドは次のようになります。
df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
上記のコマンドの英語は次のとおりです。 「人が読める形式でディスク領域の使用量を取得します。grepを使用して表示したいディスクをフィルタリングします。行をawkにパイプし、スペースで区切られた5番目の単語(null値が削除された)を印刷し、結果の文字列フォーマットされている場合、このコマンドは整数を返します。78
これはディスクが78%であることを意味します。
答え3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
df | tail +2
最初の2行をスキップしてからすべての出力を取得するsed s/%//g
パーセント記号の削除awk ...
出力の5番目のフィールドが90より大きい数値の場合は、「Alert ...」を印刷します。
答え4
上記のGillesの答えについては言及できませんが、awkは2番目の部分で文字列ベースの比較を実行します。
$5 >= ALERT
1桁のしきい値をテストしたときにこれが見つかりました。 +0を使ってintに変換できるので、比較は次のようになります。
$5+0 >= ALERT