BASH хранит значения в массиве и проверяет разницу каждого значения - PullRequest
0 голосов
/ 09 марта 2012

[CentOS, BASH, cron] Есть ли способ объявления вариантов, которые сохранятся даже при перезапуске системы?

Сценарий заключается в ошибках интерфейса ввода-вывода snmpwalk и сохранении значений в массиве.Задание cron для snmpwalk снова, скажем, через 5 минут, будет иметь другой набор значений.Я хотел бы сравнить их с предыдущим соответствующим значением каждого интерфейса.Если разница превышает пороговое значение (50), генерируется предупреждение.

Итак, вопрос: как сохранить переменную массива, которая потерялась бы в системе?и как проверить разницу каждого значения в двух массивах?


ОБНОВЛЕНИЕ 16 марта 2012 г. Я прилагаю свой последний скрипт для справки.

#!/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

1 Ответ

0 голосов
/ 09 марта 2012

Сохранить переменные в файле. Добавить отметку о дате:

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

Считать последние значения из файла:

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

Это также дает вам хороший файл журнала, где вы можете отслеживать изменения. Я предлагаю всегда добавлять файл, чтобы вы могли легко видеть, когда служба не работает / по какой-то причине не работает.

Чтобы проверить изменения, вы можете использовать простой if

if [[ "...old values..." != "...new values..." ]]; then
    send mail
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...