ディスク使用率が90%を超えた場合にアラートメールを送信するシェルスクリプト


11

ディスク使用率が90%を超えると自動的に電子メールアラートを送信し、95%を超えると2番目の電子メールアラートを送信するスクリプトをサーバーに実装したいと思います。私のファイルシステムはabc:/xyz/abcで、マウントポイントは/pqrです。

私はこれを試しました:

ADMIN="someone@def.com" 
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 

回答:


13

エラーは、-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 

6

%dを使用してprintをprintfに変更すると、パーセンテージは整数になります。試してください:

printf("%d", $5);

91%を91に変換します。最後のコマンドは次のとおりです。

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

上記の英語のコマンド: 「人間が読める形式でディスク容量の使用状況を取得します。grepで確認したいディスクに絞り込みます。その行をawkにパイプし、スペースで区切られた5番目の単語を出力して(空を削除して)、フォーマットします。結果の文字列を整数として返します。私にとって、コマンドは整数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より大きい場合、「アラート...」を出力します

1
Stack Exchangeへようこそ!いくつかの説明とコンテキストを提供する長い回答を探しています。1行で答えるのではなく、それがどのように機能するかを説明します。説明を含まない回答は削除される場合があります。
G-Manは、「モニカの復活」を2015

0

これが私の変種です:

#!/bin/bash

ADMIN=yermail@yerdom.com
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

0

上記のGillesの回答についてコメントすることはできませんが、awkが2番目の部分で文字列ベースの比較を行っていることに注意してください。

$5 >= ALERT

1桁のしきい値をテストしているときに、このことに気付きました。+0を使用してキャストを強制的にintにできるため、比較は次のようになります。

$5+0 >= ALERT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.