因为系统偶发性出现cpu占用超过100%,并且持续很久需要重启服务才能给解决。
因此我就试着写了个脚本,当超过80%就抓取线程快照,并记录每个线程占用cpu的百分比,这样就可以方便的找到罪魁祸首啦。
一开始我用的是ps -mp命令来获取每个线程占用的cpu,后来发现数据跟top显示的整个java进程的百分比相差甚远啊。仔细一研究,原来这两个命令差别很大。前者计算的是从进程启动到当前的进程占用平均值,后者是-d 参数确定的时间段,一般只设置几秒。所以后来改用top命令。ps -mp $pid -o THREAD,tid,time
top -d 5 -bn 1 -Hp $pid
上面这个是linux系统提供的,不怪shell,只怪我自己英文不好,没有认真看man。但是后面几个坑绝对应该shell来背锅。
1) expr不支持浮点运算,bc,awk才支持浮点
2)关于变量作用域也很奇怪,全局变量可能在某段代码修改后未生效。
如果使用了非内建命令例如管道符,当前进程会创建一个子进程来处理,那么在子进程中对全局变量的修改在子进程以外是不起作用的。是不是相当奇怪啊,又不是内部变量,是全局变量啊。cpu=0
cat $file | while read line
do
cpu=$(echo "$line"|awk '{print $1}')
done
echo $cpu
输出是0,如果把管道符改成下面这种重定向方式,就可以输出文件中的值while read line
do
cpu=$(echo "$line"|awk '{print $1}')
done
echo $cpu
3) 浮点数的比较
这一点准确的说不是问题,应该说是我作为shell脚本小白不知道的太多了,记录一下if[1.1-gt1];then
echo"OK"
fi
系统会报错 line3: [:1.1: integer expression expected,改成下面这种就对了if[ `echo"1.1 > 1"| bc` -eq1];then
echo"OK"
fi
4)重定向到文件后同时也想输出打印到终端echo "ABCD" >> $file
就无法输出到终端,这时候就需要用到teeecho "ABCD" | tee -a $file