[CentOS,BASH,cron] 有没有一种方法可以声明即使系统重启也会保留的变体?
场景是 snmpwalk 接口 I/O 错误并将值存储在数组中。5 分钟后再次执行 snmpwalk 的 cron 作业将获得另一组值。我想将它们与每个接口的先前对应值进行比较。如果差异超过阈值(50),则会生成警报。
所以问题是:如何存储系统中会丢失的数组变量?以及如何检查两个数组中每个值的差异?
更新 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
答案1
使用适当的语言(Perl、Python 或其他语言)并将数组存储到文件中。
答案2
正如 SvenW 所说,使用 Perl、Python 或 Ruby 等编程语言是最简单的。要在重启后保留数组,只需将内容写入文件,然后在脚本启动时读取该文件。如果您想要此过程任何部分的示例,请添加评论。