• shell脚本实例-shell 分析系统瓶颈脚本


    #!/usr/bin/bash

    PS3="Your choice is: [10 for quit]"

    #检查是那个系统

    os_check() {

    if [ -e /etc/redhat-release ]; then

    REDHAT=`cat /etc/redhat-release |cut -d' ' -f1`

    else

    DEBIAN=`cat /etc/issue |cut -d' ' -f1`

    fi

    if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then

    P_M=yum

    elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then

    P_M=apt-get

    else

    Operating system does not support.

    exit 1

    fi

    }

    #判断是否是root用哦过户

    if [ $LOGNAME != root ]; then

    echo "Please use the root account operation."

    exit 1

    fi

    #查看cpu工具是否安装

    if ! which vmstat &>/dev/null; then

    echo "vmstat command not found, now the install."

    sleep 1

    os_check

    $P_M install procps -y

    echo "-----------------------------------------------------------------------"

    fi

    #查看磁盘使用率的工具是否安装

    if ! which iostat &>/dev/null; then

    echo "iostat command not found, now the install."

    sleep 1

    os_check

    $P_M install sysstat -y

    echo "-----------------------------------------------------------------------"

    fi

    while true; do

    select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit; do

    case $input in

    cpu_load)

    #CPU usage and load

    echo "---------------------------------------"

    i=1

    while [[ $i -le 3 ]]; do

    echo -e " Reference value${i}"

    UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`

    USER=`vmstat |awk '{if(NR==3)print $13"%"}'`

    SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`

    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`

    echo "Util: $UTIL"

    echo "User use: $USER"

    echo "System use: $SYS"

    echo "I/O wait: $IOWAIT"

    i=$(($i+1))

    sleep 1

    done

    echo "---------------------------------------"

    break

    ;;

    disk_load)

    #硬盘I/O负载

    echo "---------------------------------------"

    i=1

    while [[ $i -le 3 ]]; do

    echo -e " Reference value${i}"

    UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`

    READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`

    WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`

    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`

    echo -e "Util:"

    echo -e "${UTIL}"

    echo -e "I/O Wait: $IOWAIT"

    echo -e "Read/s: $READ"

    echo -e "Write/s: $WRITE"

    i=$(($i+1))

    sleep 1

    done

    echo "---------------------------------------"

    break

    ;;

    disk_use)

    #硬盘利用率

    DISK_LOG=/tmp/disk_use.tmp

    DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&//dev/{printf $2" ";printf "%d",$3;print "GB"}'`

    USE_RATE=`df -h |awk '/^/dev/{print int($5)}'`

    for i in $USE_RATE; do

    if [ $i -gt 90 ];then

    PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`

    echo "$PART = ${i}%" >> $DISK_LOG

    fi

    done

    echo "---------------------------------------"

    echo -e "Disk total: ${DISK_TOTAL}"

    if [ -f $DISK_LOG ]; then

    echo "---------------------------------------"

    cat $DISK_LOG

    echo "---------------------------------------"

    rm -f $DISK_LOG

    else

    echo "---------------------------------------"

    echo "Disk use rate no than 90% of the partition."

    echo "---------------------------------------"

    fi

    break

    ;;

    disk_inode)

    #disk inode useage

    INODE_LOG=/tmp/inode_use.tmp

    INODE_USE=`df -i |awk '/^/dev/{print int($5)}'`

    for i in $INODE_USE; do

    if [ $i -gt 90 ]; then

    PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`

    echo "$PART = ${i}%" >> $INODE_LOG

    fi

    done

    if [ -f $INODE_LOG ]; then

    echo "---------------------------------------"

    rm -f $INODE_LOG

    else

    echo "---------------------------------------"

    echo "Inode use rate no than 90% of the partition."

    echo "---------------------------------------"

    fi

    break

    ;;

    mem_use)

    #memory useage

    echo "---------------------------------------"

    MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`

    USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`

    FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`

    CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`

    echo -e "Total: $MEM_TOTAL"

    echo -e "Use: $USE"

    echo -e "Free: $FREE"

    echo -e "Cache: $CACHE"

    echo "---------------------------------------"

    break

    ;;

    tcp_status)

    #tcp connection status

    echo "---------------------------------------"

    COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`

    echo -e "TCP connection status: $COUNT"

    echo "---------------------------------------"

    ;;

    cpu_top10)

    # top 10 of cpu processes

    echo "---------------------------------------"

    CPU_LOG=/tmp/cpu_top.tmp

    i=1

    while [[ $i -le 3 ]]; do

    #ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG

    ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i" ";else printf $i}}' |sort -k4 -nr |head -10 > $CPU_LOG

    #循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列

    if [[ -n `cat $CPU_LOG` ]]; then

    echo -e " Reference value${i}"

    cat $CPU_LOG

    > $CPU_LOG

    else

    echo "No process using the CPU."

    break

    fi

    i=$(($i+1))

    sleep 1

    done

    echo "---------------------------------------"

    break

    ;;

    mem_top10)

    #top of memory processes

    echo "---------------------------------------"

    MEM_LOG=/tmp/mem_top.tmp

    i=1

    while [[ $i -le 3 ]]; do

    #ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG

    ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i" ";else printf $i}}' |sort -k4 -nr |head -10 > $MEM_LOG

    if [[ -n `cat $MEM_LOG` ]]; then

    echo -e " Reference value${i}"

    cat $MEM_LOG

    > $MEM_LOG

    else

    echo "No process using the Memory."

    break

    fi

    i=$(($i+1))

    sleep 1

    done

    echo "---------------------------------------"

    break

    ;;

    traffic)

    # check network

    while true; do

    read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth

    #if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "<$eth>"` -eq 1 ]]; then

    if [ `ifconfig |grep -c "<$eth>"` -eq 1 ]; then

    break

    else

    echo "Input format error or Don't have the card name, please input again."

    fi

    done

    echo "---------------------------------------"

    echo -e " In ------ Out"

    i=1

    while [[ $i -le 3 ]]; do

    #OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`

    #OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`

    OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`

    #CentOS6和CentOS7 ifconfig输出进出流量信息位置不同,CentOS6中RX与TX行号等于8,CentOS7中RX行号是5,TX行号是5,所以就做了个判断.

    OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`

    sleep 1

    NEW_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`

    NEW_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`

    IN=`awk 'BEGIN{printf "%.1f ",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`

    OUT=`awk 'BEGIN{printf "%.1f ",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`

    echo "${IN}MB/s ${OUT}MB/s"

    i=$(($i+1))

    sleep 1

    done

    echo "---------------------------------------"

    break

    ;;

    quit)

    exit 0

    ;;

    *)

    echo "---------------------------------------"

    echo "Please enter the number."

    echo "---------------------------------------"

    break

    ;;

    esac

    done

    done

    作者简介: 
    陈志珂(头条号:强扭的瓜不好吃)目前就职于中国最大的安卓应用软件公司,任高级工程师现在公司任php开发工程师,python开发工程师,高级运维工程师,公众号“铅笔学园”运维内容合作作者之一。
    铅笔学园:IT资源分享|知识分享,做初级程序员的指明灯

  • 相关阅读:
    SQL Server公共表表达式简介
    SQL Server实现递归查询(使用公共表表达式)
    Qt 怎么检测鼠标在不在某个控件上
    设计模式之命令模式要听话!
    Leetcode 119. 杨辉三角 II
    C++11智能指针shared_ptr的理解与使用示例
    Qt 纯C++项目发布为dll的方法(超详细步骤)
    error C1041: 无法打开程序数据库“xxx\vc140.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用/FS(亲测可用)
    WIN1064位编译OpenSSL详细教程
    Qt信号重载需要使用函数指针来实现信号/槽机制
  • 原文地址:https://www.cnblogs.com/qianbixueyuan/p/9452591.html
Copyright © 2020-2023  润新知