分析系统资源性能瓶颈脚本
一、脚本功能:
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-get) if [ "$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="\033[32m" #前景色(文字颜色)红色 W_C_reset="\033[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"\n"}'` 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:\n${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:\n$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列以后的打印规则:打印到最后一列后加上一个换行符\n,不是最后一列不加换行符 #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"\n";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列以后的打印规则:打印到最后一列后加上一个换行符\n,不是最后一列不加换行符 #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"\n";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\n",'$((${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\n",'$((${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函数