• linux中监控CPU、内存和磁盘状态的shell脚本。(centos7)


      这篇博客中所写的脚本,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控。不过自己写一遍,可以让初学者对CPU、内存、磁盘等一些基础知识和基础命令更加了解。

    1、利用vmstat工具监控CPU详细信息,然后基于/proc/stat计算CPU利用率进行监控,超过80报警并提取出占用cpu最高的前十进程。

    vmstat是Linux系统监控工具,使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。

    r:运行队列中的进程数;b:等待IO的进程数。

    swpd:已用虚拟内存大小(k);free:空闲内存大小;buff:已用缓冲大小;cache:已用缓存大小。

    si:每秒从交换区写入内存的大小(kb/s);so:每秒从内存写入交换分区的大小。

    bi:每秒读取的块数;bo每秒写入的块数。

    in:每秒中断数,包括时钟中断;cs:每秒上下文切换数。

    us(user time):用户进程执行消耗cpu时间;sy(system time):系统进程执行消耗cpu时间;id:空闲时间(包括IO等待时间);wa:等待IO时间。

    /proc/stat:

        这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。可以利用其中信息计算cpu的利用率。

    每行每个参数的意思为(以第一行为例,单位:jiffies,1jiffies=0.01秒):

    user(62124):从系统启动开始累计到当前时刻,用户态的CPU时间,不包含 nice值为负进程。

    nice(11):从系统启动开始累计到当前时刻。

    system(47890):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间。

    idle(8715270):从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间。

    iowait(84729):从系统启动开始累计到当前时刻,硬盘IO等待时间。

    irq(0):从系统启动开始累计到当前时刻,硬中断时间。

    softirq(1483):从系统启动开始累计到当前时刻,软中断时间。

    CPU时间=user+nice+system+idle+iowait+irq+softirq。

    CPU利用率=(idle2-idle1)/(cpu2-cpu1)*100。

    ps aux:

    显示其他用户启动的进程(a)

    查看系统中属于自己的进程(x)

    启动这个进程的用户和启动时间 (u)

    代码如下:

    #!/bin/bash
    #
    CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p')
    CPU_sy=$(vmstat | awk '{print $14}' | sed -n '$p')
    CPU_id=$(vmstat | awk '{print $15}' | sed -n '$p')
    CPU_wa=$(vmstat | awk '{print $16}' | sed -n '$p')
    CPU_st=$(vmstat | awk '{print $17}' | sed -n '$p')
    
    CPU1=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
    sleep 5
    CPU2=`cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}'`
    IDLE1=`echo $CPU1 | awk '{print $4}'`
    IDLE2=`echo $CPU2 | awk '{print $4}'`
    CPU1_TOTAL=`echo $CPU1 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
    CPU2_TOTAL=`echo $CPU2 | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
    IDLE=`echo "$IDLE2-$IDLE1" | bc`
    CPU_TOTAL=`echo "$CPU2_TOTAL-$CPU1_TOTAL" | bc`
    #echo -e "IDLE2:$IDLE2
    IDLE1:$IDLE1
    CPU2:$CPU2_TOTAL
    CPU1:$CPU1_TOTAL"
    #echo -e        "IDLE:$IDLE
    CPU:$CPU_TOTAL"
    RATE=`echo "scale=4;($CPU_TOTAL-$IDLE)/$CPU_TOTAL*100" | bc | awk '{printf "%.2f",$1}'`
    
    echo -e "us=$CPU_us	sy=$CPU_sy	id=$CPU_id	wa=$CPU_wa	st=$CPU_st"
    echo "CPU_RATE:${RATE}%"
    CPU_RATE=`echo $RATE | cut -d. -f1`
    #echo   "CPU_RATE:$CPU_RATE"
    if      [ $CPU_RATE -ge 80 ]
    then    echo "CPU Warn"
            ps aux | grep -v USER | sort -rn -k3 | head
    fi

     2、利用free工具监控内存利用率,超过80报警并提取出占用内存最高的前十进程。

    代码如下:

    #!/bin/bash
    #
    total=$(free -m | sed -n '2p' | awk '{print $2}')
    used=$(free -m | sed -n '2p' | awk '{print $3}')
    free=$(free -m | sed -n '2p' | awk '{print $4}')
    shared=$(free -m | sed -n '2p' | awk '{print $5}')
    buff=$(free -m | sed -n '2p' | awk '{print $6}')
    cached=$(free -m | sed -n '2p' | awk '{print $7}')
    rate=`echo "scale=2;$used/$total" | bc | awk -F. '{print $2}'`
    echo -e "total	used	free	shared	buffer	available"
    echo -e "${total}M	${used}M	${free}M	${shared}M	${buff}M	${cached}M
    rate:${rate}%"
    if    [ $rate -ge 80 ]
    then    echo "Memory Warn"
        ps aux | grep -v USER | sort -rn -k4 | head
    fi

    3、利用df命令监控磁盘利用率,超过80报警。

    df :显示磁盘分区上的可使用的磁盘空间。

      -h 以更易读的方式显示;

      -P 使用POSIX的输出格式。

    #!/bin/bash
    #
    DEV=`df -hP | grep '^/dev/*' | cut -d' ' -f1 | sort`
    for I in $DEV
    do dev=`df -Ph | grep $I | awk '{print $1}'`
    size=`df -Ph | grep $I | awk '{print $2}'`
    used=`df -Ph | grep $I | awk '{print $3}'`
    free=`df -Ph | grep $I | awk '{print $4}'`
    rate=`df -Ph | grep $I | awk '{print $5}'`
    mount=`df -Ph | grep $I | awk '{print $6}'`
    echo -e "$I:	size:$size	used:$used	free:$free	rate:$rate	mount:$mount"
    F=`echo $rate | awk -F% '{print $1}'`
    if [ $F -ge 80 ];then
        echo "$mount Warn"
        else echo "It's OK"
    fi
    done

    CPU物理信息

    查看物理cpu个数:

      cat /proc/cpuinfo | grep "physical id" | uniq | wc -l

    查看cpu核数:

      cat /proc/cpuinfo | grep "cpu cores" | uniq

    查看逻辑cpu个数:

      cat /proc/cpuinfo | grep "processor" | wc -l

  • 相关阅读:
    Matlab Tricks(二十九) —— 使用 deal 将多个输入赋值给多个输出
    释名 —— 名称的含义、来源
    Eclipse快捷键 今天又学会了几个不常用的 收藏了
    HDU 2527
    UVAlive 2326 Moving Tables(贪心 + 区间问题)
    STM32关于优先级设定的理解 NVIC_SetPriority()
    linux6.2安装mysql
    【PAT】1009. Product of Polynomials (25)
    Android的重力传感器(3轴加速度传感器)简单实例
    out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
  • 原文地址:https://www.cnblogs.com/houyongchong/p/7872432.html
Copyright © 2020-2023  润新知