linux脚本好难,shell脚本真的难用啊。。。可读性差可维护性差

因为系统偶发性出现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值