shell 检测http状态码邮件告警

2017年11月28日 0 条评论 1.36k 次阅读 0 人点赞

[v_blue]脚本使用mutt命令发送邮件,可以替换为mail,使用方法//www.sevenfal.com/2017/11/29/1019.html[/v_blue]

#!/bin/bash
ly_ver=1.0.3
date1="2017-12-04 14:06"
#curl 检测超时(秒)
curl_timeout=5
#检测出现 3 次状态码不正常后邮件报警
mail_do=3
#故障未恢复再次告警时间(8小时以后)
let check_check=60*8

path1=/usr/local/monitor

if [ ! -x /usr/bin/monitor ];then
	cp $0 /usr/bin/monitor
	chmod +x /usr/bin/monitor
fi

if $(crontab -l |grep -q '^\* \* \* \* \* sh /usr/local/monitor/crontab_do$') ;then
	cd .
else 
	(crontab -l 2>/dev/null;echo '* * * * * sh /usr/local/monitor/crontab_do') |crontab -
fi

function url_add(){
	echo "请输入需要添加监控的网址(eg. http://baidu.com/):"
	read check_url
	read -p "请输入网址正常的状态码(eg. 200):" check_code
	until echo ${check_code} |grep -q "^[[:digit:]]\+$" ;do
		read -p "请输入网址正常的状态码(eg. 200):" check_code
	done
	echo "${check_code} ${check_url} 0" >> ${path1}/url_list.txt
}
function url_list(){
	cat -n ${path1}/url_list.txt
}
function url_del(){
	url_list
	read -p "请输入需要删除的行号(eg. 2):" del_line
	until echo ${del_line} |grep -q "^[[:digit:]]\+$" ;do
		read -p "请输入需要删除的行号(eg. 2):" del_line
	done
	sed -i "${del_line}d" ${path1}/url_list.txt
	url_list
}

function mail_add(){
	echo "请输入需要通知的邮箱地址(eg. [email protected]):"
	read mail_name
	echo "${mail_name}" >> ${path1}/mail_list.txt
}
function mail_list(){
	cat -n ${path1}/mail_list.txt
}
function mail_del(){
	mail_list
	read -p "请输入需要删除的行号(eg. 2):" del_line
	until echo ${del_line} |grep -q "^[[:digit:]]\+$" ;do
		read -p "请输入需要删除的行号(eg. 2):" del_line
	done
	sed -i "${del_line}d" ${path1}/mail_list.txt
	mail_list
}

function monitor_check(){
	mkdir -p ${path1}
	if [ ! -f ${path1}/url_list.txt ];then
		touch ${path1}/url_list.txt
	fi
	if [ ! -f ${path1}/mail_list.txt ];then
		touch ${path1}/mail_list.txt
	fi
	rm -rf ${path1}/crontab_do
	echo '#!/bin/bash' > ${path1}/crontab_do
	echo 'path1=/usr/local/monitor' >> ${path1}/crontab_do
	echo "curl_timeout=${curl_timeout}" >> ${path1}/crontab_do
	echo "check_check=${check_check}" >> ${path1}/crontab_do
	echo "mail_do=${mail_do}" >> ${path1}/crontab_do
	cat <<"EOF" >> ${path1}/crontab_do
cat -n ${path1}/url_list.txt | while read val;do
	url_num=`echo $val|awk -F ' ' '{print $1}'`
	check_code=`echo $val|awk -F ' ' '{print $2}'`
	check_url=`echo $val|awk -F ' ' '{print $3}'`
	check_num=`echo $val|awk -F ' ' '{print $4}'`
	now_code=`curl -I -s --connect-timeout ${curl_timeout} -m ${curl_timeout} -o /dev/null -w %{http_code} ${check_url}`
	time1=`date "+%Y-%m-%d %H:%M:%S"`
	if [ ${now_code} != ${check_code} ]
		then
			let check_num=${check_num}+1
			sed -i "${url_num} a${check_code} ${check_url} ${check_num}" ${path1}/url_list.txt
			sed -i "${url_num}d" ${path1}/url_list.txt
			if [[ ${check_num} = ${mail_do} || ${check_num} = ${check_check} ]]
					then
						for mail_name in `cat ${path1}/mail_list.txt`;do
							echo "故障时间:${time1} <br>故障链接:${check_url} <br>当前状态码:<span stytle${now_code}</span><br>目标状态码:${check_code}" | mutt -s "故障出现:${check_url} 状态码异常!" -e 'set content_type="text/html"' ${mail_name}
						done
			fi
		else
			sed -i "${url_num} a${check_code} ${check_url} 0" ${path1}/url_list.txt
			sed -i "${url_num}d" ${path1}/url_list.txt
			if (( ${check_num} > ${mail_do} ))
				then
					for mail_name in `cat ${path1}/mail_list.txt`;do
						echo "解除时间:${time1} <br>故障链接:${check_url} <br> 当前状态码:<span style='color:green'>${now_code} </span><br>目标状态码:${check_code}" | mutt -s "故障解除:${check_url} 状态码正常!" -e 'set content_type="text/html"' ${mail_name}
					done
			fi
	fi
	
done
EOF
chmod +x ${path1}/crontab_do

}

echo "+-------------------------------------------+"
echo "|         Monitor for http code  ${ly_ver}      |"
echo "+-------------------------------------------+"
echo "|                        ${date1}   |"
echo "+-------------------------------------------+"
arg1=$1
arg2=$2
monitor_check


case ${arg1} in
	add)
		if [ "${arg2}" = "url" ];then 
			url_add
		elif [ "${arg2}" = "mail" ];then 
			mail_add
		else
			echo "Usage: monitor add {url|mail}"
		fi
	;;
	list)
		if [ "${arg2}" = "url" ];then 
			url_list
		elif [ "${arg2}" = "mail" ];then 
			mail_list
		else
			echo "Usage: monitor list {url|mail}"
		fi
	;;
	del)
		if [ "${arg2}" = "url" ];then 
			url_del
		elif [ "${arg2}" = "mail" ];then 
			mail_del
		else
			echo "Usage: monitor del {url|mail}"
		fi
	;;
	*)
	echo "Usage: monitor {add|list|del} {url|mail}"
	;;
esac

Sevenfal

这个人太懒什么东西都没留下

文章评论(0)