今天上午有一台存储服务器未读写,但由于是集群环境,并没有发现这个问题。后来偶然看到该服务器负载为0才发现不对劲,正常情况下应该为5。平时我们监控都是负载高于某个值,而从没想过负载太低也是问题。
为防止后续再出现此情况,决心编写监控负载下限的nagios插件,当负载低于某个值时,则报警。
该脚本应该能替代nagios插件包中的监控负载脚本,自带插件只能监控上限。无法监控下限,预期功能如下:
1、可设置下限的警告阈值,紧急阈值。
2、可设置上限的警告阈值,紧急阈值。
3、也可只设置上限或下限警告阈值。
1、 语法错误输出帮助信息
[root@hostb libexec]# shcheck_load_low.sh -LW 0.5,0.5,0.5,0.5 #传参数多时错误。
Option:
parament one
--lower_limit_warn|-LW ;set lower warning limit threshold value.
--upper_limit_warn|-UW ;set upper warning limit threshold value.
parament two
--lower_limit_crit|-LC ;set lower crit limit threshold value.
--upper_limit_crit|-LC ;set upper crit limit threshold value.
Example:
check_load_low.sh -LW 0.5,0.5,0.5 -LC 0.1,0.1,0.1
check_load_low.sh -UW 15,15,15 -UC 20,20,20
check_load_low.sh -LW 1,1,1
check_load_low.sh -UW 15,15,15
2、设置下限警告阈值、紧急阈值执行效果
[root@hostb libexec]# shcheck_load_low.sh -LW 8,8,8 -LC 7,7,7
#同时低于警告阈值与紧急阈值,退出值为2
crit,load average: 4.93, 5.64, 5.96
[root@hostb libexec]# echo $?
2
[root@hostb libexec]# sh check_load_low.sh-LW 8,8,8 -LC 1,1,1
#低于警告阈值高于紧急阈值,退出值为1
warn,load average: 4.82, 5.43, 5.85
[root@hostb libexec]# echo $?
1
[root@hostb libexec]# shcheck_load_low.sh -LW 1,1,1 -LC 0.5,0.5,0.5
#负载高于警告,紧急阈值,则正常
OK,load average: 5.59, 5.54, 5.85
[root@hostb libexec]# echo $?
0
3、 设置上限警告阈值、紧急阈值执行效果
[root@hostb libexec]# shcheck_load_low.sh -UW 5,5,5 -UC 6,6,6
#高于警告值,低于紧急值则退出值为1
warn,load average: 5.28, 5.35, 5.73
[root@hostb libexec]# echo $?
1
[root@hostb libexec]# shcheck_load_low.sh -UW 4,4,4 -UC 5,5,5
#同时高于警告值、紧急值则退出值为2
crit,load average: 5.28, 5.35, 5.73
[root@hostb libexec]# echo $?
2
[root@hostb libexec]# shcheck_load_low.sh -UW 15,15,15 -UC 20,20,20
#同时低于警告值、紧急值则退出值为0
OK,load average: 5.20, 5.32, 5.68
[root@hostb libexec]# echo $?
0
[root@hostb libexec]# cat check_load_low.sh #!/bin/sh #####获得当前cpu负载信息##### load1=`uptime|awk -F: '{print $5}'|awk -F, '{print$1}'` load5=`uptime|awk -F: '{print $5}'|awk -F, '{print$2}'` load15=`uptime|awk -F: '{print $5}'|awk -F, '{print$3}'` ###定义帮助信息函数##### help(){ echo "Option:" echo "parament one" echo " --lower_limit_warn|-LW ;setlower warning limit threshold value." echo " --upper_limit_warn|-UW ;setupper warning limit threshold value." echo "parament two" echo " --lower_limit_crit|-LC ;setlower crit limit threshold value." echo " --upper_limit_crit|-LC ;setupper crit limit threshold value." echo "Example:" echo " $0 -LW 0.5,0.5,0.5 -LC 0.1,0.1,0.1" echo " $0 -UW 15,15,15 -UC 20,20,20" echo " $0 -LW 1,1,1" echo " $0 -UW 15,15,15 " } ####获取第一个warn传参值,可以是上限阈值或下限阈值###### case $1 in --lower_limit_warn|-LW) load_warn=(`echo $2|sed 's/,/ /g'`) load1_warn=${load_warn[0]} load5_warn=${load_warn[1]} load15_warn=${load_warn[2]} ;; --upper_limit_warn|-UW) load_warn=(`echo $2|sed 's/,/ /g'`) load1_warn=${load_warn[0]} load5_warn=${load_warn[1]} load15_warn=${load_warn[2]} ;; esac #####获取crit传参值,可以是上限阈值或下限阈值###### case $3 in --lower_limit_crit|-LC) load_crit=(`echo $4|sed 's/,/ /g'`) #系统uptime输出中有逗号,用sed替换。 load1_crit=${load_crit[0]} #使用数组来分别取负载3个值 load5_crit=${load_crit[1]} load15_crit=${load_crit[2]} ;; --upper_limit_crit|-UC) load_crit=(`echo $4|sed 's/,/ /g'`) load1_crit=${load_crit[0]} load5_crit=${load_crit[1]} load15_crit=${load_crit[2]} ;; esac #####定义下限告警比较函数######## lower_warn_compare(){ #把阈值和当前系统值进行对比。 load1_warn_compare=`echo "$load1 > $load1_warn"|bc` load5_warn_compare=`echo "$load5 > $load5_warn"|bc` load15_warn_compare=`echo "$load15 > $load15_warn"|bc` #如果系统值比阈值低,则比较变量值为1,便于后续调用 if [[$load1_warn_compare == 0 ]];then lower_warn_compare=1 elif[[ $load5_warn_compare == 0 ]];then lower_warn_compare=1 elif[[ $load15_warn_compare == 0 ]];then lower_warn_compare=1 else lower_warn_compare=0 fi } ####定义下限紧急比较函数#### lower_crit_compare(){ #把阈值和当前系统值进行对比 load1_crit_compare=`echo "$load1 > $load1_crit"|bc` load5_crit_compare=`echo "$load5 > $load5_crit"|bc` load15_crit_compare=`echo "$load15 > $load15_crit"|bc` #如果系统值比阈值低,则比较变量值为2,便于后续调用 if [[$load1_crit_compare == 0 ]];then lower_crit_compare=2 elif[[ $load5_crit_compare == 0 ]];then lower_crit_compare=2 elif[[ $load15_crit_compare == 0 ]];then lower_crit_compare=2 else lower_crit_compare=0 fi } ####定义上限告警比较函数### upper_warn_compare(){ #把阈值和当前系统值进行对比 load1_warn_compare=`echo "$load1 > $load1_warn"|bc` load5_warn_compare=`echo "$load5 > $load5_warn"|bc` load15_warn_compare=`echo "$load15 > $load15_warn"|bc` #如果系统值比阈值高,则比较变量值为1,便于后续调用 if [[$load1_warn_compare == 1 ]];then upper_warn_compare=1 elif[[ $load5_warn_compare == 1 ]];then upper_warn_compare=1 elif[[ $load15_warn_compare == 1 ]];then upper_warn_compare=1 else upper_warn_compare=0 fi } ####定义上限紧急比较函数### upper_crit_compare(){ #把阈值和当前系统值进行对比 load1_crit_compare=`echo "$load1 > $load1_crit"|bc` load5_crit_compare=`echo "$load5 > $load5_crit"|bc` load15_crit_compare=`echo "$load15 > $load15_crit"|bc` #如果系统值比阈值高,则比较变量值为2,便于后续调用 if [[$load1_crit_compare == 1 ]];then upper_crit_compare=2 elif [[$load5_crit_compare == 1 ]];then upper_crit_compare=2 elif[[ $load15_crit_compare == 1 ]];then upper_crit_compare=2 else upper_crit_compare=0 fi } ####如果系统参数数量不是2或4,则输出帮助信息### if [[ $# == 2 || $# == 4 ]];then values2=(`echo $2|sed 's/,/ /g'`) values4=(`echo $4|sed 's/,/ /g'`) #如果紧急负载值为空,或是3个值则正常,否则输出帮助信息并退出 if [[${values4[@]} == "" || ${#values4[@]} == 3 ]];then a=1 else help exit2 fi #如果警告负载值不是3个,则输出帮助信息并退出 if [[${#values2[@]} != 3 ]];then help exit2 fi else help exit 2 fi ####判断告警传参,执行相应的比较函数。 case $1 in --lower_limit_warn|-LW) lower_warn_compare ;; --upper_limit_warn|-UW) upper_warn_compare ;; *) #如果输入与上述两点不匹配,则输出帮助信息 help ;; esac ####判断紧急传参,执行相应的比较函数。 case $3 in --lower_limit_crit|-LC) lower_crit_compare ;; --upper_limit_crit|-UC) upper_crit_compare ;; "") a=1 ;; *) help ;; esac ####执行成功后,输出负载信息### ####此处变量在上面函数中都有定义,如果该变量等于1或2,则代表负载超过或低于阈值。则退出值为相应的状态值。 if [[ $upper_crit_compare == 2 ]];then echo"crit,load average: $load1,$load5,$load15" exit2 elif [[ $lower_crit_compare == 2 ]];then echo"crit,load average: $load1,$load5,$load15" exit2 elif [[ $upper_warn_compare == 1 ]];then echo"warn,load average: $load1,$load5,$load15" exit1 elif [[ $lower_warn_compare == 1 ]];then echo"warn,load average: $load1,$load5,$load15" exit1 else echo"OK,load average: $load1,$load5,$load15" exit0 fi
本文出自 “�铍�” 博客,转载请与作者联系!