码迷,mamicode.com
首页 > 其他好文 > 详细

bash计时器的实现案例:检查并记录网络稳定性的脚本

时间:2015-04-28 18:46:28      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:bash   icmp   计数器   

bash的帮助中提到SECONDS系统变量:

SECONDS Each  time this parameter is referenced, the number of seconds since shell invocation is returned.  If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned.  If SECONDS is unset, it loses its special properties, even if it is subsequently reset.


我们在程序执行期间,检查这个变量,即可实现记时的功能。


本例是用来每隔一个固定时间,ping一个IP,出现故障时记录下来的脚本。

#!/bin/bash 
#set -o errexit

export SCRIPT=$0
SID=$PPID
usage(){
	echo -e "Usage:"
	echo -e "\tbash $0 [OPTs]"
	echo -e "\t-W|--timeout\t\t<M>"
	echo -e "\t-I|--interval\t\t<N>"
	echo -e "\t-i|--ip\t\t\t<A.B.C.D>"
	echo -e "\t-L|--level\t\t<info|error>"
	echo -e "\t-l|--log\t\t</tmp/${SCRIPT}-${SID}.log>"
	echo -e "\t-h\t\t\tPrint this info"
	echo -e "Example:"
	echo -e "\tbash $0 -W 1 -I 3 -i 127.0.0.1 -L error -log /tmp/${SCRIPT}-${SID}.log"
	echo -e "\tbash $0"
	exit 255
}

[ $# -eq 4 ] && usage
# 默认参数
LOGFILE="/tmp/${SCRIPT}-${SID}.log"
touch $LOGFILE
TIMEOUT=1
INTERVAL=10
LEVEL=info
IP=127.0.0.1
MyIP=$(ip addr sh eth0 |awk ‘/^[\ ]*inet /{split($2,IP,"/");printf IP[1]}‘)
# 参数获取
TEMP=$(getopt -o W:I:i:L:l:h --long timeout:,interval:,ip:,level:,log:,help -- "$@")
[ $? != 0 ] && usage
eval set -- "$TEMP" 


# 参数处理
while true; do
	case "$1" in
		-W|--timeout) TIMEOUT=$2; shift 2;;
		-I|--interval) INTERVAL=$2; shift 2;;
		-i|--ip) IP=$2; shift 2;;
		-L|--level) LEVEL=$2; shift 2;;
		-l|--log) LOGFILE=$2; shift 2;;
		-h|--help) usage; shift;;
		--) shift; break ;;
	esac
done


[ "$IP" = "" ] && usage
adjust(){
	return $((SECONDS%INTERVAL))
}

pinger(){
	ping $1 -W $TIMEOUT -c 1 | tail -1 |awk -F/ ‘{print $(NF-1)}‘ 2>/dev/null  
}	

logger(){
	echo -e "$(date +%F" "%T)\t""$@"	
}

trapper(){
	trap "logger \"EXIT($SID)\t$MyIP -> $IP\" >> $LOGFILE && exit 0"  1 2 9 15 
}

trapper
logger "START($SID)\t$MyIP -> $IP" >> $LOGFILE 
while true
do
	if adjust; then
		unset t 
		t=$(pinger $IP)
		if [ "$t" = "" ]; then
			logger "ERROR($SID)\t$MyIP -> $IP ${TIMEOUT}(S)" >> $LOGFILE &
		else
			[ "$LEVEL" = "erorr" ] || logger "INFO($SID)\t$MyIP -> $IP ${t}(ms)" >> $LOGFILE &
		fi
		sleep 1
	fi
	sleep 0.1
done

执行

bash pinger.sh -W 1 -I 2 -i a.b.c &

执行结果如下:

# tail -f -n 10 /tmp/bash-26729.log 

2015-04-28 17:24:50 START(26729)192.168.202.2 -> a.b.c

2015-04-28 17:24:50 INFO(26729)192.168.202.2 -> a.b.c 0.630(ms)

2015-04-28 17:24:52 INFO(26729)192.168.202.2 -> a.b.c 0.575(ms)

2015-04-28 17:24:54 INFO(26729)192.168.202.2 -> a.b.c 0.875(ms)


本文出自 “希奥开源” 博客,请务必保留此出处http://wangxiaoyu.blog.51cto.com/922065/1639861

bash计时器的实现案例:检查并记录网络稳定性的脚本

标签:bash   icmp   计数器   

原文地址:http://wangxiaoyu.blog.51cto.com/922065/1639861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!