系统资源统计

分析系统资源性能瓶颈脚本

一、脚本功能:

1.查看CPU利用率与负载(top、vmstat、sar),脚本中采用vmstat

2.查看磁盘、Inode利用率与I/O负载(df、iostat、iotop、sar、dstat),脚本中采用df、iostat

3.查看内存利用率(free、vmstat),脚本中采用free

4.查看TCP连接状态(netstat、ss),脚本中采用ss

5.查看CPU与内存占用最高的10个进程(tcp、ps),脚本中采用ps

6.查看网络流量(ifconfig、iftop、iptraf),脚本中采用ifconfig

二、脚本内容:

vim show_sys_info.sh

#!/bin/bash
#show system information

os_check(){  #检查linux系统版本
    #检查系统类型
    if [ -e /etc/redhat-release ];then   #如果存在/etc/redhat-release文件,则获取文件内容
        REDHAT=`cat /etc/redhat-release |cut -d' ' -f1`   #获取/etc/redhat-release文件内容并以空格进行分割后获取第一列的数据
    else  #如果不存在/etc/redhat-release文件,则获取/etc/issue 文件的内容,红帽版本和德班版本都有这个文件,红帽班这个文件不存系统类型,德班存在
        DEBIAN=`cat /etc/issue |cut -d' ' -f1` #获取//etc/issue文件内容并以空格进行分割后获取第一列的数据
    fi
    
    #根据系统类型选择包管理(红帽为yum,德班为apt-getif [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ] ;then   #如果是centos系统或者red系统,则使用yum 为包管理
        P_M=yum
    elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubuntu" ] ;then  #如果是Ubuntu系统或者ubuntu系统,则使用apt-get 为包管理
        P_M=apt-get
    else  #否则答应系统不存在,程序退出,返回1(语句执行成功后,正常应该返回0.此处为异常返回,自定义返回值1)
        echo "Operating system does not support."
        exit 1
    fi
}

account_check(){
    #判断是否为root用户
    if [ "$LOGNAME" != "root" ];then  #系统变量$USER或者$LOGNAME都表示当前用户名,如果当前用户名不是root,则提示要用root用户并且退出,返回值2
        echo "Please use the root account operation."
        exit 2
    fi
}
account_check   #调用用户检查函数

vmstat_check(){  #检查指定的应用(vmstat)是否安装,如果没有则进行安装
    which vmstat &>/dev/null    #执行which,命令查看执行的vmstat($1为函数的第一个位置参数,例如:如果为vmstat应用,则函数第一个位置参数传递vmstat)
                                #&>/dev/null为将执行的which命令后输出的结果重定向到垃圾桶中,即不显示输出的结果
                                #如果存在应用,则命令执行后的返回值为0.否则返回不是0
                                #vmstat为显示内存使用情况的工具,一般系统自带,
    if [ $? -ne 0 ];then   # $?表示上一条命令的执行后的返回值,如果上一条命令执行后的返回值不是0,则说明没有找到该应用,进行安装
        echo "vmstat command not found, now the install."   #打印说明
        sleep 1   #睡1秒
        os_check  #调用系统检查函数,函数中定义的变量默认为全局变量,如果不希望是全局变量,则需要用local 定义变量
              $P_M install procps -y   #安装procops,即可以找到vmstat

        
    fi
}

vmstat_check   #调用vmstat检查函数

iostat_check(){  #检查指定的应用(vmstat)是否安装,如果没有则进行安装
    which iostat &>/dev/null    #执行which,命令查看执行的iostat($1为函数的第一个位置参数,例如:如果为vmstat应用,则函数第一个位置参数传递vmstat)
                                #&>/dev/null为将执行的which命令后输出的结果重定向到垃圾桶中,即不显示输出的结果
                                #如果存在应用,则命令执行后的返回值为0.否则返回不是0
                                #iostat为监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息,一般系统不自带,需要安装
    if [ $? -ne 0 ];then   # $?表示上一条命令的执行后的返回值,如果上一条命令执行后的返回值不是0,则说明没有找到该应用,进行安装
        echo "iostat command not found, now the install."   #打印说明
        sleep 1   #睡1秒
        os_check  #调用系统检查函数,函数中定义的变量默认为全局变量,如果不希望是全局变量,则需要用local 定义变量
        $P_M install sysstat -y   #安装sysstat,即可以找到iostat
        
    fi
}

iostat_check   #调用iostat检查函数

#定义颜色变量
W_C_Red="33[32m"   #前景色(文字颜色)红色
W_C_reset="33[0m"  #关闭所有属性

#获取cpu负载
get_cpu_load(){
    #cpu利用率和负载
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
    
        IDLE_CPU=`vmstat |awk '{if(NR==3)print $15"%"}'`  #使用awk命令获取第三行以空格分割,第15列的内容,并且后面加上百分号(%)
        UITL_CPU=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`  #使用awk命令获取100减去第三行以空格分割,第15列的内容的差值,并且后面加上百分号
        USER_CPU=`vmstat |awk '{if(NR==3)print $13"%"}'`  #使用awk命令获取第三行以空格分割,第13列的内容,并且后面加上百分号
        SYS_CPU=`vmstat |awk '{if(NR==3)print $14"%"}'`  #使用awk命令获取第三行以空格分割,第14列的内容,并且后面加上百分号
        IOWAIT_CPU=`vmstat |awk '{if(NR==3)print $16"%"}'`  #使用awk命令获取第三行以空格分割,第16列的内容,并且后面加上百分号
        
        #打印获取到的内容
        echo "空闲占比:$IDLE_CPU"
        echo "使用占比:$UITL_CPU"
        echo "用户使用占比:$USER_CPU"
        echo "系统使用占比:$SYS_CPU"
        echo "系统等待IO的CPU时间百分比:$IOWAIT_CPU"
        
        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取cpu负载,获取到的是同一条数据
get_cpu_load_one(){
    #cpu利用率和负载
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
        vm_data="echo `vmstat`"   #vmstat获取数据
        echo ${vm_data}   #打印vm_data的值
        IDLE_CPU=`${vm_data} |awk '{print $(NF-2)"%"}'`  #使用awk命令获取第一行以空格分割,第倒数第3列的内容,并且后面加上百分号(%)
        UITL_CPU=`${vm_data} |awk '{print 100-$(NF-2)"%"}'`  #使用awk命令获取100减去第一行以空格分割,倒数第3列的内容的差值,并且后面加上百分号
        USER_CPU=`${vm_data} |awk '{print $(NF-4)"%"}'`  #使用awk命令获取第一行以空格分割,倒数第5列的内容,并且后面加上百分号
        SYS_CPU=`${vm_data} |awk '{print $(NF-3)"%"}'`  #使用awk命令获取第一行以空格分割,倒数第4列的内容,并且后面加上百分号
        IOWAIT_CPU=`${vm_data} |awk '{print $(NF-1)"%"}'`  #使用awk命令获取第三行以空格分割,倒数第2列的内容,并且后面加上百分号
        
        #打印获取到的内容
        echo "空闲占比:$IDLE_CPU"
        echo "使用占比:$UITL_CPU"
        echo "用户使用占比:$USER_CPU"
        echo "系统使用占比:$SYS_CPU"
        echo "系统等待IO的CPU时间百分比:$IOWAIT_CPU"
        
        let i++   #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取硬盘IO负载
get_disk_load(){
    #硬盘IO负载
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
    
        UTIL_DISK=`iostat -x -k |awk '/^[s|d]/{OFS=": ";print $1,$NF"%"}'`  #使用awk命令获取iostat -x -k命令输出内容中的以s或d开头的行,将行以空格或者冒号分割后,打印第一列和最后一列,且后面加上百分号
        READ_DISK=`iostat -x -k |awk '/^[s|d]/{OFS=": ";print $1,$6"KB"}'`  #使用awk命令获取iostat -x -k命令输出内容中的以s或d开头的行,将行以空格或者冒号分割后,打印第一列和第6列,且后面加上KB
        WRITE_DISK=`iostat -x -k |awk '/^[s|d]/{OFS=": ";print $1,$7"KB"}'`  #使用awk命令获取iostat -x -k命令输出内容中的以s或d开头的行,将行以空格或者冒号分割后,打印第一列和第7列,且后面加上KB
        IOWAIT_CPU=`vmstat |awk '{if(NR==3)print $16"%"}'`  #使用awk命令获取第三行以空格分割,第16列的内容,并且后面加上百分号
        
        #打印获取到的内容
        echo -e "磁盘使用率:"
        echo -e "${UTIL_DISK}"
        echo -e "系统等待IO的CPU时间百分比:"
        echo -e    "$IOWAIT_CPU"
        echo -e "磁盘IO每秒读的速度(Read/s):"
        echo -e "$READ_DISK"
        echo -e "磁盘IO每秒写的速度(Write/s):"
        echo -e "$WRITE_DISK"
        
        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取硬盘利用率
get_disk_use(){
    #硬盘利用率
    DISK_LOG=/tmp/disk_use.tmp    #定义硬盘利用率日志记录文件
    #使用fdisk -l命令获取内容后,使用awk命令获取其中以Disk开头,间隔任意多个字符,且出现bytes,并且包含/dev的行,以空格分割,获取其中第2列的内容,第3列中的整数部分,第四列中的内容,且在第4列内容前加一个空格,其后加上换行符
    DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/ && //dev/{printf $2" ";printf "%d",$3;printf " "$4"
"}'`
    
    USER_RATE=`df -h |awk '/^/dev/{print int($5)}'` #执行df -h获取内容后,使用awk获取其中以/dev开头的内容,将其以空格分割后,打印第5列中的整数部分
    
    local i   #定义局部变量i
    
    for i in ${USER_RATE};do
        if [ ${i} -gt 90 ];then  #如果变量i的值大于90,则记录到文件中
            PART=`df -h |awk '{if(int($5)=='''${i}''') print $6}'`   #如果变量i的值等于awk获得的第五列的值,则打印获取第六列的值
            echo "$PART = ${i}%" >> $DISK_LOG   #追加内容到变量DISK_LOG文件中
        fi
    done
    
    echo "------------------------------------------------------------"
    echo -e "Disk total:
${DISK_TOTAL}"   #打印磁盘总量
    
    if [ -f ${DISK_LOG} ] ;then  #如果变量DiSK_LOG值对应的文件存在,则cat查看,并且看后删除
        echo "------------------------------------------------------------"
        cat ${DISK_LOG}
        echo "------------------------------------------------------------"
        rm -rf ${DISK_LOG}
    else   #否则说明不存在大于90%
        echo "------------------------------------------------------------"
        echo "Disk use rate no than 90% of the partition."
        echo "------------------------------------------------------------"
        
    fi

}

#获取硬盘inode利用率
get_disk_inode(){
    #硬盘利用率
    INODE_LOG=/tmp/inode_use.tmp    #定义硬盘利用率日志记录文件

    INODE_USE=`df -i |awk '/^/dev/{print int($5)}'` #执行df -i获取内容后,使用awk获取其中以/dev开头的内容,将其以空格分割后,打印第5列中的整数部分
    
    local i   #定义局部变量i
    
    for i in ${INODE_USE};do
        if [ ${i} -gt 90 ];then  #如果变量i的值大于90,则记录到文件中
            PART=`df -i |awk '{if(int($5)=='''${i}''') print $6}'`   #如果变量i的值等于awk获得的第五列的值,则打印获取第六列的值
            echo "$PART = ${i}%" >> $INODE_LOG   #追加内容到变量DISK_LOG文件中
        fi
    done
    
    if [ -f ${INODE_LOG} ] ;then  #如果变量INODE_LOG值对应的文件存在,则cat查看,并且看后删除
        echo "------------------------------------------------------------"
        cat ${INODE_LOG}
        echo "------------------------------------------------------------"
        rm -rf ${INODE_LOG}
    else   #否则说明不存在大于90%
        echo "------------------------------------------------------------"
        echo "Inode use rate no than 90% of the partition."
        echo "------------------------------------------------------------"
    fi

}

#获取内存利用率
get_mem_use(){
    #内存利用率
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
    
        MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`  #使用awk命令获取free -m命令输出内容中的第二行以空格分割的第二列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_USE=`free -m |awk '{if(NR==2)printf "%.1f",$3/1024}END{print "G"}'`  #使用awk命令获取free -m命令输出内容中的第二行以空格分割的第3列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_FREE=`free -m |awk '{if(NR==2)printf "%.1f",$4/1024}END{print "G"}'`  #使用awk命令获取free -m命令输出内容中的第二行以空格分割的第4列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_CACHE=`free -m |awk '{if(NR==2)printf "%.1f",$6/1024}END{print "G"}'`  #使用awk命令获取free -m命令输出内容中的第二行以空格分割的第6列的值除以1024后取1位小数的浮点数,之后再打印G
        
        #打印获取到的内容
        echo -e "总内存:"
        echo -e "${MEM_TOTAL}"
        echo -e "已使用内存:"
        echo -e    "${MEM_USE}"
        echo -e "空闲内存:"
        echo -e "${MEM_FREE}"
        echo -e "已经缓存:"
        echo -e "$MEM_CACHE"
        
        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取内存利用率,同一条数据
get_mem_use_one(){
    #内存利用率
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
        free_data="echo `free -m`"   #free -m获取数据
        echo ${free_data}   #打印free_data的值
    
        MEM_TOTAL=`${free_data} |awk '{printf "%.1f",$8/1024}END{print "G"}'`  #使用awk命令获取free_data变量中的内容中的以空格分割的第8列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_USE=`${free_data} |awk '{printf "%.1f",$9/1024}END{print "G"}'`  #使用awk命令获取free_data变量中的内容中的以空格分割的第9列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_FREE=`${free_data} |awk '{printf "%.1f",$10/1024}END{print "G"}'`  #使用awk命令获取free_data变量中的内容中的以空格分割的第10列的值除以1024后取1位小数的浮点数,之后再打印G
        MEM_CACHE=`${free_data} |awk '{printf "%.1f",$12/1024}END{print "G"}'`  #使用awk命令获取free_data变量中的内容中的以空格分割的第12列的值除以1024后取1位小数的浮点数,之后再打印G
        
        #打印获取到的内容
        echo -e "总内存:"
        echo -e "${MEM_TOTAL}"
        echo -e "已使用内存:"
        echo -e    "${MEM_USE}"
        echo -e "空闲内存:"
        echo -e "${MEM_FREE}"
        echo -e "已经缓存:"
        echo -e "$MEM_CACHE"
        
        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取网络连接状态
get_tcp_status(){
    #内存利用率
    echo "------------------------------------------------------------"
    local i   #定义局部变量i
    i=1
    local j   #定义局部变量j
    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
    
        COUNT=`ss -ant |awk '!/State/{status[$1]++}END{for(j in status) print j,status[j]}'`  #使用awk命令获取ss -ant命令输出内容查找不包含State内容的行,以空格分割后获取第一列数据保存到关联数据status数组中,关联数组的索引为第一列的内容,值为对应索引出现的次数
        #打印获取到的内容
        echo -e "TCP connection status:
$COUNT"

        
        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取占用CPU高的前10个进程
get_cpu_top10(){
    #占用CPU高的前10个进程
    echo "------------------------------------------------------------"
    CPU_LOG=/tmp/cpu_top.tmp    #定义cpu_top的缓存文件
    
    local i   #定义局部变量i
    i=1
    local j   #定义局部变量i

    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        #使用ps aux获取系统每一个进程的内容
        #之后使用awk命令,以空格分割每一行,如果每一行第3列的值大于0.0,则打印每行的第二例、第三列的内容,以及第11列及其以后的内容(如果有)
        #11列以后的打印规则:打印到最后一列后加上一个换行符
,不是最后一列不加换行符
        #NF为最后一列的列数
        #sort -k4 -nr:为将获取到的内容用以空格分割后,以第四列为排序列,进行比较后倒叙排列
        #head -10:为将获取到的内容取前10行的内容
        #最后将获取到的内容记录到$CPU_LOG文件中
        ps aux |awk '{if($3>0.0){{printf "PID: "$2" CPU: "$3"% -->"}for(j=11;j<=NF;j++)if(j==NF)printf $j"
";else printf $j}}'|sort -k4 -nr|head -10 >$CPU_LOG
        
        if [[ -n `cat $CPU_LOG` ]];then  #如果$CPU_LOG文件中的内容的长度不为0,即有内容,则打印显示相应的内容
            echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
            cat $CPU_LOG  #显示$CPU_LOG文件中的内容
        else  #否则显示没有进程使用CPU
            echo "NO process using the CPU"
            break  #退出while循环
        fi

        let i++    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取占用内存高的前10个进程
get_mem_top10(){
    #占用内存高的前10个进程
    echo "------------------------------------------------------------"
    MEM_LOG=/tmp/mem_top.tmp    #定义mem_top的缓存文件
    
    local i   #定义局部变量i
    i=1
    local j   #定义局部变量i

    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        #使用ps aux获取系统每一个进程的内容
        #之后使用awk命令,以空格分割每一行,如果每一行第4列的值大于0.0,则打印每行的第二例、第三列的内容,以及第11列及其以后的内容(如果有)
        #11列以后的打印规则:打印到最后一列后加上一个换行符
,不是最后一列不加换行符
        #NF为最后一列的列数
        #sort -k4 -nr:为将获取到的内容用以空格分割后,以第四列为排序列,进行比较后倒叙排列
        #head -10:为将获取到的内容取前10行的内容
        #最后将获取到的内容记录到$MEM_LOG文件中
        ps aux |awk '{if($4>0.0){{printf "PID: "$2" Memory: "$4"% -->"}for(j=11;j<=NF;j++)if(j==NF)printf $j"
";else printf $j}}'|sort -k4 -nr|head -10 >$MEM_LOG
        
        if [[ -n `cat $MEM_LOG` ]];then  #如果$MEM_LOG文件中的内容的长度不为0,即有内容,则打印显示相应的内容
            echo -e "${W_C_Red} 参考值${i} ${W_C_reset}"  #打印绿色文字后又恢复原色
            cat $MEM_LOG  #显示$MEM_LOG文件中的内容
        else  #否则显示没有进程使用内存
            echo "NO process using the Memory"
            break  #退出while循环
        fi

        i=$(($i+1))    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#获取网络流量
get_traffic(){
    #查看网络流量
    #判断输入的网卡是否存在
    while true;do
        read -p "Please enter the network card name: " eth
        if [ `ifconfig |grep -c "<${eth}>"` -eq 1 ];then   #如果查询到网卡内容的个数等于1则说明输入的网卡正确,否者让再次输入
            break
        else
            echo "Input format error or Don't have the card name,please input again."
        fi
    done
    
    echo "------------------------------------------------------------"
    echo -e "In ------ Out"
    
    local i   #定义局部变量i
    i=1

    while [[ $i -le 3 ]];do  #[[]]为数值运算符号,-le为小于等于,当变量值i小于等于3时执行while循环
        #CentOS6和CentOS7 ifconfig输出进出流量信息位置不同
        #ContOS6中RX和TX行号等于8
        #ContOS7中RX行号是5,TX行号等于7
        #获取上一秒的输入输出流量
        OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`  #获取ifconfig $eth内容后
                                                          #使用awk命令将获取到的内容按照冒号或者空格分割
                                                          #并且查找包含bytes的行,如果行号等于8,就打印改行第4列内容
                                                          #如果行号是5,就打印改行第6列内容
        OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
        echo ${OLD_IN}
        echo ${OLD_OUT}
        sleep 1  #间隔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}'`
        echo ${NEW_IN}
        echo ${NEW_OUT}
        IN=`awk 'BEGIN{printf "%.4f
",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`  #使用awk的BEGIN,新值减去旧值,除以1024再除以128
                                                             #1M带宽=1024kb/8bit=128KB(1M带宽对应的下载速度为128KB)
                                                             #1024Kbits/s=128KBytes/s
                                                             #1024Kbps的全称为1024Kbits/s,即单位是元,而128KBytes/s的单位是字节,一个字节等于8位元
                                                             #有线宽带的宽带的换算方法:1Mbps=1024/8(KBps)=128KBps,即128KBytes/s
                                                             #50M带宽对应的下载速度为50*126=6400KB
        OUT=`awk 'BEGIN{printf "%.4f
",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`
        
        echo "${IN}MB/s ${OUT}MB/s"  #打印相应的值
        
                                                            
        i=$(($i+1))    #变量i加1赋值给变量i(i自加1)
        sleep 1   #睡1秒
    done
    echo "------------------------------------------------------------"
}

#定义PS3的内容(select选择的内容提示信息)
PS3="Your choice is: "

#使用while死循环显示select循环内容
display_select(){
    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
            #从in后面中选择一个赋值给input变量
            #此处使用case处理input变量对应值的情况
            case $input in
                cpu_load)
                    #调用获取cpu负载函数
                    get_cpu_load_one
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                disk_load)
                    #调用获取硬盘IO负载函数
                    get_disk_load
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                disk_use)
                    #调用获取硬盘利用率函数
                    get_disk_use
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                disk_inode)
                    #调用获取硬盘inode利用率函数
                    get_disk_inode
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                mem_use)
                    #调用获取内存利用率函数
                    get_mem_use
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                    
                tcp_status)
                    #调用获取网络连接状态函数
                    get_tcp_status
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                cpu_top10)
                    #调用获取占用CPU高的前10个进程函数
                    get_cpu_top10
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                mem_top10)
                    #调用获取占用内存高的前10个进程函数
                    get_mem_top10
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                    
                traffic)
                    #调用获取网络流量函数
                    get_traffic
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                quit)
                    exit     #退出脚本,退出程序
                    ;;       #case一个条件结束符号
                
                *)   #*代表其他任意内容,如果是其他任意内容,则提示输入相应内容且退出循环
                    echo "------------------------------------------------------------"
                    echo "Please enter the number."
                    echo "------------------------------------------------------------"
                    break    #跳出select循环,继续while循环
                    ;;       #case一个条件结束符号
                
                
            esac
        done
    done
}

$1  #脚本第一个位置参数,赋值后调用相应的函数

:wq!:保存

chmod a+x show_sys_info.sh :给脚本show_sys_info.sh赋可执行权限

./show_sys_info.sh display_select :执行脚本,调用 display_select函数

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注