• 系统资源统计


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

    一、脚本功能:

    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函数

  • 相关阅读:
    菜鸟运维笔记:安装MySQL,PHP及phpMyAdmin
    在MyEclipse中统计项目行数
    工作已定,望悉
    经常使用算法之贪心
    leetcode
    程序猿的量化交易之路(20)--Cointrader之Assert实体(8)
    【MySQL】 查询某个数据库有多少张数据表
    【powerdesigner】将pdm或者cdm保存为普通图片格式
    【web maven】新建的项目 controller也有,从前台跳转后台 无法找到对应的controller
    【Java 新建项目】使用程序对新项目的各个实体 创建Dao、DaoImpl、Service、ServiceImpl层的文件
  • 原文地址:https://www.cnblogs.com/jingzaixin/p/12563758.html
Copyright © 2020-2023  润新知