美文网首页技术类
shell脚本真的难用啊。。。可读性差可维护性差

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

作者: 33小宇宙 | 来源:发表于2019-08-23 16:53 被阅读0次

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

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 

就无法输出到终端,这时候就需要用到tee

echo "ABCD"    | tee -a $file


相关文章

  • shell脚本真的难用啊。。。可读性差可维护性差

    因为系统偶发性出现cpu占用超过100%,并且持续很久需要重启服务才能给解决。 因此我就试着写了个脚本,当超过80...

  • shell脚本小结

    心得:shell脚本可读性非常差,编写完之后应该有相应的注释,是否之后修改起来会非常麻烦。 #set 查看bash...

  • shell里调用python代码及多行字符串变量

    1.shell里调用python代码 场景是在shell里调用python代码 可读性差 2.shell变量内容多...

  • 手机臂包难用

    难用,质量也差,还得再选个好点的。

  • FreeBSD 切换 shell

    默认root账户是 csh shell,其他账户是 sh shell,好安全(难用)啊~~没有历史命令,没有自动补...

  • 减少if条件判断句提高代码可读性

    过多的条件判断导致可读性差 过多的if条件判断不仅可读性差,写出来的代码也不整齐。一个解决方法是不断优化自己的代码...

  • 设计原则和设计模式

    1. 代理模式 1.1. 静态代理和动态代理 静态代码的问题与缺陷 静态代理违反了开闭原则 可扩展性差 可维护性差...

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • 2018-09-26

    shell脚本 1.1、什么是shell脚本(shell script , ...

  • 带你搞懂Java动态代理

    在说动态代理之前要先了解一下他的由来 因为静态代理扩展能力差,可维护性差,所以JDK提供了动态代理。那么就让我们从...

网友评论

    本文标题:shell脚本真的难用啊。。。可读性差可维护性差

    本文链接:https://www.haomeiwen.com/subject/rjytectx.html