ディスク使用量が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行は%
を削除します 印刷する前にパーセンテージ列から。
すべてのファイルシステムについて1通のメールを送信する方がよいでしょう。今回はすべての分析を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