2012-03-09 14 views
0

[CentOS、BASH、cron]システムを再起動しても変わらないバリアントを宣言する方法はありますか?BASHが配列に値を格納し、各値の差を確認する

シナリオは、snmpwalkインターフェイスのI/Oエラーを配列に格納します。 5分後にもう一度snmpwalkするcronジョブには別の値が設定されます。各インタフェースの以前の対応する値と比較したいと思います。差がしきい値(50)を超えると、アラートが生成されます。

したがって、問題は、システムで失われる配列変数を保存する方法です。 2つの配列の各値の違いをチェックする方法は?


更新日2012年3月16日最終的なスクリプトをここに添付します。

#!/bin/bash 
# This script is to monitor interface Input/Output Errors of Cisco devices, by snmpwalk the error values every 5 mins, and send email alert if incremental value exceeds threshold (e.g. 500). 
# Author: Wu Yajun | Created: 12Mar2012 | Updated: 16Mar2012 
########################################################################## 

DIR="$(cd "$(dirname "$0")" && pwd)" 
host=device.ip.addr.here 

# Check and initiate .log file storing previous values, create .tmp file storing current values. 
test -e $DIR/host1_ifInErrors.log || snmpwalk -c public -v 1 $host IF-MIB::ifInErrors > $DIR/host1_ifInErrors.log 
snmpwalk -c public -v 1 $host IF-MIB::ifInErrors > $DIR/host1_ifInErrors.tmp 

# Compare differences of the error values, and alert if diff exceeds threshold. 
# To exclude checking some interfaces, e.g. Fa0/6, Fa0/10, Fa0/11, change the below "for loop" to style as: 
# for i in {1..6} {8..10} {13..26} 
totalIfNumber=$(echo $(wc -l $DIR/host1_ifInErrors.tmp) | sed 's/ \/root.*$//g') 

for ((i=1; i<=$totalIfNumber; i++)) 
do 
     currentValue=$(cat $DIR/host1_ifInErrors.tmp | sed -n ''$i'p' | sed 's/^.*Counter32: //g') 
     previousValue=$(cat $DIR/host1_ifInErrors.log | sed -n ''$i'p' | sed 's/^.*Counter32: //g') 
     diff=$(($currentValue-$previousValue)) 
     [ $diff -ge 500 ] && (ifName=$(echo $(snmpwalk -c public -v 1 $host IF-MIB::ifName.$i) | sed 's/^.*STRING: //g') ; echo "ATTENTION - Input Error detected from host1 interface $ifName" | mutt -s "ATTENTION - Input Error detected from host1 interface $ifName" <email address here>) 
done 

# Store current values for next time checking. 
snmpwalk -c public -v 1 $host IF-MIB::ifInErrors > $DIR/host1_ifInErrors.log 

答えて

0

変数をファイルに保存します。日付スタンプを追加します。

tail -1 "$file" | cut "-d#" -f2 | read ... variables here .... 

も、あなたが変更を監視することができます素敵なログファイルを提供します:

echo "$(date)#... variables here ...." >> "$file" 

は、ファイルの最後の値を読みます。私は常にファイルに追加することをお勧めします。そのため、何らかの理由でサービスが停止/実行されなかったことを簡単に確認できます。

変更を確認するには、あなたがこの方法の簡単なif

if [[ "...old values..." != "...new values..." ]]; then 
    send mail 
fi 
+0

を使用することができます** **のSQLiteのことを思い出します。 – Andrew

+0

SQLデータベースは、余分な複雑さを犠牲にして多くの機能を提供する別のオプションです。しかし、最終的には、データを何とかディスクに保存する必要があります。テキストファイルまたはSQLデータファイルを使用する場合は、設計の問題です。 –

+0

私の仕事は、実際にはlast_updated_valueとcurrent_valueの違いが重要です。私はまだシステムに保持できる変数を宣言するための答えを探しています。私は "環境変数VSローカル変数"のようなものを聞いたが、何が内部にあるかは分からない。あなたのアドバイスを感謝します。 – Andrew

関連する問題