美文网首页
shell编程第八节--shell编程实战

shell编程第八节--shell编程实战

作者: 梦回上玄 | 来源:发表于2019-08-19 11:56 被阅读0次

    shell快讲第一节--shell基础
    shell快讲第二节--管道与重定向
    shell快讲第三节--正则表达式
    shell快讲第四节--sed与awk
    shell快讲第五节--shell语法基础
    shell快讲第六节--shell函数编程
    shell快讲第七节--shell编程规范与调试
    shell快讲第八节--shell编程实战

    shell场景化编程

    状态查询类脚本解析

    1、进程状态查询,这是我们之前写的一个进程查询类的脚本,SEP是自定义的分隔符,实际写脚本中为了方便被第三方软件采集,自定义分隔符是必要的,当然或许输出不那么好看

    #!/bin/bash
    
    #通用的进程查看,提取了最关键的几个维度
    #process_name='mysqld'
    
    SEP="@"
    
    checkprocess(){
        p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
        echo "HOSTNAME${SEP}COMMAND${SEP}STAT${SEP}USER${SEP}PID${SEP}CPU${SEP}MEM${SEP}INFO"
        if [ -z "$p_pids" ];then
          echo "no found process"
        else
            for p_pid in $p_pids;
            do
                p_command=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $11" "$12'}`
                p_stat=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $8'}`
                p_user=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $1'}`
                p_cpu=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $3'}`
                p_mem=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $4'}`
                # echo 'COMMAND,STAT,USER,PID,CPU,MEM,INFO'
                echo "$HOSTNAME${SEP}$p_command${SEP}$p_stat${SEP}$p_user${SEP}$p_pid${SEP}$p_cpu${SEP}$p_mem${SEP}found process $1"
            done
    
        fi
    }
    #checkprocess $process_name
    checkprocess @option.process_name@
    

    上面的脚本是我们随手写的,其实也有很多不科学的地方,首先各个采集数据并不是一个cpu时间片下的,大家看下下面,对比下上面的哪里不够科学

    SEP="@"
    
    checkprocess(){
        p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
        echo "COMMAND${SEP}STAT${SEP}USER${SEP}CPU${SEP}MEM${SEP}PID${SEP}HOSTNAME${SEP}INFO"
        if [ -z "$p_pids" ];then
            echo "No found process"
        else
            for p_pid in $p_pids;
            do
            a=`ps -axu |grep $1 |grep $p_pid`#这里如果不单独给变量,会被awk带来未知影响,要测试好
            echo $a |awk -v pid=$p_pid -v hostname=$HOSTNAME -v i="found telegraf" 'BEGIN{OFS="@"}{print $8,$1,$3,$4,pid,hostname,i}'
            done
        fi
    }
    #checkprocess $process_name
    checkprocess telegraf
    

    分析:下面的代码所有的采集数据是一个ps命令产生的,相对第一个代码就更科学一点,我们也可以用time命令来测下两个脚本的执行时间损耗
    未完待续.....

    相关文章

      网友评论

          本文标题:shell编程第八节--shell编程实战

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