一个实现cpu load预警的shell脚本

由于项目组的需要,最近用bash shell实现了cpu load预警的脚本,之前完全没有过shell的经验,甚至连linux的经验也基本为零,所以写了一天多的时间算是勉强完成,关键地方还是别人指导的,实在是惭愧。其逻辑很简单,就是获取当前cpu load,如果超过预定的值,就会发送邮件或者短信报告相关人员。

 

#!/bin/bash
#cpu load / cpu count load和cpu个数的比值
cpu_load_threshold=1.50

now_time=`date +"%Y-%m-%d-%H:%M:%S"`

ip=`/sbin/ifconfig | grep inet | awk '{print $2 }' | cut -d: -f2 | sed -n '2p'`

cpu_nums=`cat /proc/cpuinfo | grep "processor"|wc -l`

load_average=`w | grep 'average' | cut -d',' -f4 | cut -d':' -f2 | cut -d' ' -f2`

load5=`w | grep 'average' | cut -d',' -f5 | cut -d' ' -f2`

load15=`w | grep 'average' | cut -d',' -f6 | cut -d' ' -f2`

threshold=`awk 'BEGIN{printf "%.4f\n","'"$load_average"'"/"'"$cpu_nums"'"}'`

if [ $threshold \> $cpu_load_threshold ]
then
 msg="cpu%20load%20alarm""[${load_average},${load5},${load15}]%20""${now_time}%20""${ip}%20""CPUCount""${cpu_nums}"
# echo "the mail send begin..."
# echo -e "$msg" > mail.txt
# mail -s "cpu load alarm" xxx.com < mail.txt
# echo "the mail send end..."

#sms list
 echo "the sms send begin..."
 #短信发送的实现
 echo "the sms send end..."

fi

 如果用java实现,恐怕不到半天就可以搞定,我特别讨厌shell的语法,乱七八糟的字符,毫无代码质量可言,出现了错误也找不出问题。可能是java先入为主的原因,不过多学一种工具终究是好的。

shell一些基本的语法

Bash shell中对变量的赋值不能有空格,有空格的话,它会把它当做命令:

比如:

[root@SJSWT36-139 ~]# a =5

-bash: a: command not found

[root@SJSWT36-139 ~]# a= 5

-bash: 5: command not found

如果你要想将一个命令执行返回的结果赋给一个变量的话,你可能会写成a= w

但实际上a没有得到w命令的结果,这条语句只是简单的执行了w,要想将其结果赋值给a,可以采用`command` 倒引号:a=`w`

 

shell中,空格很重要,比如if语句中括号前后都要有空格才行,遇到错误的时候也要想一下是不是空格的问题。

 

shell中,没有>符号,如果要使用>,需要转义:\>

 

shell中的单引号和双引号:

被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。

被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。

 

而在awk中,却有所不同:

awk 'BEGIN{printf "%.2f\n",$a/$b}'awk 'BEGIN{printf "%.2f\n","$a"/"$b"}'都是不对的

而是awk 'BEGIN{printf "%.2f\n",'$a'/'$b'}',因为外面也有一个单引号,所以为了避免重复,可以将中间的单引号转义:

awk 'BEGIN{printf "%.2f\n","'"$a"'"/"'"$b"'"}'

CPU LOAD

Load 就是对计算机干活多少的度量(WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。【最好的参考文章:UNIX® Load Average Part 1: How It Works

load的刷新频率

load并不是上面说所的1 分钟、5分钟、15分钟刷新一次,而是5秒钟刷新一次(CALC_LOAD 每5HZ计算一次, 5HZ 为 5秒钟,这里的 HZ是系统定义的变量),所以你不能精确获取当前load,也会遇到这种情况:当你收到load短信预警但是马上去查看的时候却不是那个值。

cpu使用率和cpu load

cpu使用率很高,cpu load不一定很高,同样,cpu load很高,cpu使用率不一定很高,比如队列里都是网络或者I/O任务,所以不能简单的认为短时间cpu load很高就是cpu处理能力不行。

Load 高只是代表需要运行的队列累积过多了。但队列中的任务实际可能是耗 CPU的,也可能是耗 I/O 乃至其它因素的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值