ディスク使用量が90%を超えると警告メールを送信するシェルスクリプト

ディスク使用量が90%を超えると警告メールを送信するシェルスクリプト

ディスク使用量が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 

おすすめ記事