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

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 -- "[email protected]")
[ $? != 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""[email protected]"
}

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)

时间: 2024-10-11 12:38:17

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

编写MAC记录与端口扫描脚本的shell脚本

MAC记录与端口扫描脚本 1.需求描述编写名为system.sh的小脚本,记录局域网中各主机的MAC地址,保存到/etc/ethers文件中:若此文件已存在,应先转移进行备份:每行一条记录,第1列为IP地址,第2列为对应的MAC地址检查有哪些主机开启了匿名FTP服务,扫描对象为/etc/ethers文件中的所有IP地址,扫描的端口为212.命令测试分析:记录局域网中各主机的MAC地址,保存到/etc/ethers文件中:若此文件已存在,应先转移进行备份:检查有哪些主机开启了匿名FTP服务,扫描对

检查行锁等待问题的脚本(单机和rac都通用)

来源于: How to use historic ASH data to identify lock conflicts (文档 ID 1593227.1) 对于当前正在lock的情况,脚本为(单机和rac通用): with lk as (select blocking_instance||'.'||blocking_session blocker, inst_id||'.'||sid waiter from gv$session where blocking_instance is not n

Android工具类整理(1)检查是否有网络、检查SD卡是否存在

以下工具类主要用于: (1)检查是否有网络. (2)检查是否有WIFI. (3)检查是否有移动网络 import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class CommonUtils { /** 检查是否有网络 */ public static boolean isNetworkAvailable(Context conte

十分钟完成Bash 脚本进阶!列举Bash经典用法及其案例

前言:在linux中,Bash脚本是很基础的知识,大家可能一听脚本感觉很高大上,像小编当初刚开始学一样,感觉会写脚本的都是大神.虽然复杂的脚本是很烧脑,但是,当我们熟练的掌握了其中的用法与技巧,再多加练习,总有一天也会成为得心应手的脚本大神.脚本在生产中的作用,想必小编我不说,大家也都知道,脚本写的6,可以省下很多复杂的操作,减轻自己的工作压力.好了,废话不多说,接下来,就是Bash脚本的用法展示. 一.条件选择.判断(if·.case) 二.四个循环(for.while.until.selec

Linux bash: scp: command not found的问题记录

1,scp报错 [[email protected] soft]# scpjdk-7u55-linux-x64.tar.gz 192.168.121.246:/soft/ [email protected]'s password: bash: scp: command not found lost connection [[email protected] soft]# 2,调试-v [[email protected] soft]# scp -vjdk-7u55-linux-x64.tar.g

SSM 整合配置以及一个简单登陆案例(个人记录)

SSM 文件以及大部分参考博客 https://blog.csdn.net/qq598535550/article/details/51703190 简答的登陆注册案例下载链接在末尾补贴图了 我建立的是 IDEA maven 项目 pomxml 文件如下 1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.

一个利用静态代码分析检查并记录开源项目中存在的隐患的网站

www.viva64.com/en/examples/ 他山之石可以攻玉.不仅可以看看都有哪些常见的地雷,还可以练练英文.

检查整个目录php语法错误脚本

其实也可以检查其他语言的语法错误,把代码内的php -l 换了就行 #! /bin/bash # # check_php_syntax.sh # Copyright (C) 2014 <http://superfly81.blog.51cto.com/> # # Distributed under terms of the MIT license. # #!/bin/bash # check php syntax  if [ $# -lt 1 ];then     echo 'Usage: '

&lt;HTTP权威指南&gt;记录 ---- 网络爬虫

网络爬虫 网络爬虫(web crawler)能够在无需人类干预的情况下自动进行一系列Web事务处理的软件程序.很多爬虫会从一个Web站点逛到另一个Web站点,获取内容,跟踪超链,并对它们找到的数据进行处理.根据这些爬虫自动探查Web站点的方式,网络爬虫也可称作网络蜘蛛.蚂蚁.机器人等. 爬虫及爬行方式 Web爬虫会递归地对各种信息性Web站点进行遍历,获取第一个Web页面,然后获取那个页面指向的所有Web页面,然后是那些页面指向的所有Web页面,依此类推.递归地追踪这些Web链接的爬虫会沿着HT