b2b电商系统搭建的关键步骤与最佳实践解析,助力企业数字化转型
1076
2022-05-28
linux系统通过shell脚本实现一个全方面的系统性能分析系统
文章目录
Linux系统通过Shell脚本实现一个全方面的系统性能分析系统
1.利用select循环实现系统工具箱
2.命令技巧
3.整个脚本实现方式
4.改造成函数
4.1函数文件内容
4.2脚本内容
5.执行脚本显示所有内容
1.利用select循环实现系统工具箱
select格式和for格式一致,但是select 变量名 in xxx xxx都将打印成菜单
#!/bin/bash PS3=“enter parment: ” select xtgjx in disk_info filesystem_info ip_info mem_info cpu_info quit do case $xtgjx in disk_info) lsblk ;; filesystem_info) df -HT ;; ip_info) ifconfig | awk '/inet/{if(~/([0-9]{1,3}.){3}[0-9]{1,3}/){print }}' ;; mem_info) free -g ;; cpu_info) uptime ;; quit) break ;; *) echo "error parment" esac done 执行:./select_xtgjx.sh 1) disk_info 3) ip_info 5) cpu_info 2) filesystem_info 4) mem_info 6) quit #? 1 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 0 47G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 100G 0 disk └─sdb1 8:17 0 100G 0 part /my_scripts sr0 11:0 1 4.3G 0 rom /media #? 如果觉得#?不好看可以重新定义PS3的变量值进行更改,定义时变量值一定要加引号 ./select_xtgjx.sh 1) disk_info 3) ip_info 5) cpu_info 2) filesystem_info 4) mem_info 6) quit enter parment: 如果希望每次执行完都弹出菜单,可以套一个while循环,在没执行完菜单对应的命令后执行一个break跳出当前循环,也就是跳出select循环,虽然跳出了select循环但是还有while循环因此可以实现每执行一部分就显示菜单内容 PS3="enter parment: " while : do select xtgjx in disk_info filesystem_info ip_info mem_info cpu_info quit do case $xtgjx in disk_info) lsblk break ;; filesystem_info) df -HT break ;; ip_info) ifconfig | awk '/inet/{if(~/([0-9]{1,3}.){3}[0-9]{1,3}/){print }}' break ;; mem_info) free -g break ;; cpu_info) uptime break ;; quit) exit ;; *) echo "error parment" esac done done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
2.命令技巧
其中使用了NR==3表示遇到第三行才会模式匹配 UTIL=`vmstat | awk '{if(NR==3){print 100-"%"}}'` 这里用到了iostat命令,-d表示打印磁盘,-x表示列出详细信息 详细的iostat参数解释参照:https://www.jellythink.com/archives/438 WRITE=`iostat -d -x | awk '/^[s|v]/{OFS=":";print ,"KB"}'` 过滤出每块磁盘的大小 这里可以直接/Disk/不用加.*因为我们用到了&&还要匹配下一个规则,因为我们要打印第二列磁盘名字和第三列磁盘的大小,由于磁盘大小由小数点,因此我们使用printf 使用参数%d只显示整数,由于printf将值都显示在一行,因此最后我们使用print打印一个GB然后换行 精确匹配 fdisk -l | awk '/^Disk.*bytes/ && /\/dev/{printf " ";printf "%d",;print "GB"}' 差异匹配1 fdisk -l | awk '/^Disk/ && /\/dev/{printf ;printf "%d",;print "GB"}' 差异匹配2 fdisk -l | awk '/^Disk.*bytes/{printf " ";printf "%d",;print "GB"}' 不使用printf实现 fdisk -l | awk '/^Disk.*bytes/{print ,int()"GB"}' 如果变量内容由多行,引用是请用{}引起来例如 使用echo -e是为了支持反斜杠中的转义操作例如下面使用的\n表示换行 echo -e "disk total: \n${DISK_TOTAL}" 1.cpu利用率与负载实现方式: 定义i的值然后进行while循环,然后使用vmstat+awk过滤出util、user、sys、wait的分别对应的值如vmstat | awk '{if(NR==3){print "%"}}',然后在用echo列出这些变量值 2.磁盘io负载实现方式: 定义while循环,使用iostat+wak过滤出util、read、write、iowait的列如iostat -d -x | awk '/^[s|v]/{OFS=": ";print ,$NF"%"}'然后用echo打印出来 3.磁盘使用率: 定义日志文件,然后使用fdisk -l awk过滤出磁盘名、大小,在用df命令过滤出磁盘的使用率,写一个for循环,如果使用率大于90就打印出90的那个磁盘名,最后echo 超过90的磁盘名和实际使用率并输出到日志we文件中,然后循环结束,打印出总量,在判断日志文件是否存在,如果存在就把日志内容输出,不存在则说没有磁盘使用率超过90% 4.求磁盘利用率、磁盘inode节点,一般实现思路为:首先定义日志文件存放路径,然后定义磁盘的空间大小、磁盘使用率(用printf "%d",的形式取出数值)/inode值,然后使用for循环遍历值列表,如果i的值大于90则打印出哪一列对应的磁盘名,最后echo出磁盘名加使用率追加到日志文件中,然后使用if语句判断是否存在该日志文件,如果有则cat这个文件,并删掉,如果没有就提示没有超过90% 5.内存使用率 使用free -m结合awk打印出total、used、free、cache的值free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}',然后用echo输出 两种形式显示内存的大小,因为由于是虚拟机因此内存只有512M,所以我们使用printf来打印出浮点数 保留1位小数点,然后用公式算一下最后打印个G free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}' free -m | awk '{if(NR==2){printf "%.1f",/1024}} END{print "G"}' 6.tcp状态 直接上命令,然后打印netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}' 统计tcp状态 netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}' ss -ant | awk '!/State/{state[]++} END{for(i in state){print i,state[i]}}' 7.打印占用CPU最多的前十个进程 第一种 使用ps命令结合awk命令判断第三列如果大于0.1(因为如果CPU不大于0.1,匹配没有意义)那么就使用printf(不会换行)打印“PID:”在打印出第二列的值,在打印一个”CPU:“并且打印出第三列的值,在打印一个---->,清晰,打印完后,我们用到了for循环,因为每一个进程都有不同的参数,所以我们无法确定他有多少列,因此我们使用for循环如果i小于NF也就是字段数,那么每次加1,在使用if判断是否等于NF如果等于那么就说明打印到了最后一个参数,然后我们就换行,否则的话就一直打印,知道打印到最后一列,然后进行换行,这样可以有效地把进程所有参数打印出来 ps aux | awk '{if(>0.1){{printf "PID: " " CPU: " "%----->"}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' 第二种比较直观 ps axu | awk '{if(>0.1){print "PID: ","CPU: ","------>",$NF}}' | sort -k4 | head -10 cputop10实现思路 首先定义CPU日志文件,然后设置i的值,并开始while循环,$i -le 3循环三次,在循环体中,使用ps命令结合awk命令,打印出pid、cpu、进程命令,使用sort命令排序别结合head只显示前10个,然后追加到日志文件中,在使用if判断,日志文件是否为空,不为空打印文件内容,为空就打印没有进程占用CPU,打印前10个进程占用的命令:ps aux | awk '{if(>0.1){{printf "PID: " " CPU:" "%--->"}for (i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}',if后面使用双{}是为了将f or也连接在一起,当第一个if成立后面的for才会执行,如果是一个{}那么不管条件成不成立都会全部打印一下最后一列 也可以直接这看 ps aux | awk '{if(>0.1){print
其中使用了NR==3表示遇到第三行才会模式匹配 UTIL=`vmstat | awk '{if(NR==3){print 100-$15"%"}}'` 这里用到了iostat命令,-d表示打印磁盘,-x表示列出详细信息 详细的iostat参数解释参照:https://www.jellythink.com/archives/438 WRITE=`iostat -d -x | awk '/^[s|v]/{OFS=":";print $1,$7"KB"}'` 过滤出每块磁盘的大小 这里可以直接/Disk/不用加.*因为我们用到了&&还要匹配下一个规则,因为我们要打印第二列磁盘名字和第三列磁盘的大小,由于磁盘大小由小数点,因此我们使用printf 使用参数%d只显示整数,由于printf将值都显示在一行,因此最后我们使用print打印一个GB然后换行 精确匹配 fdisk -l | awk '/^Disk.*bytes/ && /\/dev/{printf $2" ";printf "%d",$3;print "GB"}' 差异匹配1 fdisk -l | awk '/^Disk/ && /\/dev/{printf $2;printf "%d",$3;print "GB"}' 差异匹配2 fdisk -l | awk '/^Disk.*bytes/{printf $2" ";printf "%d",$3;print "GB"}' 不使用printf实现 fdisk -l | awk '/^Disk.*bytes/{print $2,int($3)"GB"}' 如果变量内容由多行,引用是请用{}引起来例如 使用echo -e是为了支持反斜杠中的转义操作例如下面使用的\n表示换行 echo -e "disk total: \n${DISK_TOTAL}" 1.cpu利用率与负载实现方式: 定义i的值然后进行while循环,然后使用vmstat+awk过滤出util、user、sys、wait的分别对应的值如vmstat | awk '{if(NR==3){print $13"%"}}',然后在用echo列出这些变量值 2.磁盘io负载实现方式: 定义while循环,使用iostat+wak过滤出util、read、write、iowait的列如iostat -d -x | awk '/^[s|v]/{OFS=": ";print $1,$NF"%"}'然后用echo打印出来 3.磁盘使用率: 定义日志文件,然后使用fdisk -l awk过滤出磁盘名、大小,在用df命令过滤出磁盘的使用率,写一个for循环,如果使用率大于90就打印出90的那个磁盘名,最后echo 超过90的磁盘名和实际使用率并输出到日志we文件中,然后循环结束,打印出总量,在判断日志文件是否存在,如果存在就把日志内容输出,不存在则说没有磁盘使用率超过90% 4.求磁盘利用率、磁盘inode节点,一般实现思路为:首先定义日志文件存放路径,然后定义磁盘的空间大小、磁盘使用率(用printf "%d",$5的形式取出数值)/inode值,然后使用for循环遍历值列表,如果i的值大于90则打印出哪一列对应的磁盘名,最后echo出磁盘名加使用率追加到日志文件中,然后使用if语句判断是否存在该日志文件,如果有则cat这个文件,并删掉,如果没有就提示没有超过90% 5.内存使用率 使用free -m结合awk打印出total、used、free、cache的值free -m | awk '{if(NR==2){printf "%.1f",$2/1024;print "G"}}',然后用echo输出 两种形式显示内存的大小,因为由于是虚拟机因此内存只有512M,所以我们使用printf来打印出浮点数 保留1位小数点,然后用公式算一下最后打印个G free -m | awk '{if(NR==2){printf "%.1f",$2/1024;print "G"}}' free -m | awk '{if(NR==2){printf "%.1f",$2/1024}} END{print "G"}' 6.tcp状态 直接上命令,然后打印netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}' 统计tcp状态 netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}' ss -ant | awk '!/State/{state[$1]++} END{for(i in state){print i,state[i]}}' 7.打印占用CPU最多的前十个进程 第一种 使用ps命令结合awk命令判断第三列如果大于0.1(因为如果CPU不大于0.1,匹配没有意义)那么就使用printf(不会换行)打印“PID:”在打印出第二列的值,在打印一个”CPU:“并且打印出第三列的值,在打印一个---->,清晰,打印完后,我们用到了for循环,因为每一个进程都有不同的参数,所以我们无法确定他有多少列,因此我们使用for循环如果i小于NF也就是字段数,那么每次加1,在使用if判断是否等于NF如果等于那么就说明打印到了最后一个参数,然后我们就换行,否则的话就一直打印,知道打印到最后一列,然后进行换行,这样可以有效地把进程所有参数打印出来 ps aux | awk '{if($3>0.1){{printf "PID: "$2 " CPU: "$3 "%----->"}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' 第二种比较直观 ps axu | awk '{if($3>0.1){print "PID: "$2,"CPU: "$3,"------>",$NF}}' | sort -k4 | head -10 cputop10实现思路 首先定义CPU日志文件,然后设置i的值,并开始while循环,$i -le 3循环三次,在循环体中,使用ps命令结合awk命令,打印出pid、cpu、进程命令,使用sort命令排序别结合head只显示前10个,然后追加到日志文件中,在使用if判断,日志文件是否为空,不为空打印文件内容,为空就打印没有进程占用CPU,打印前10个进程占用的命令:ps aux | awk '{if($3>0.1){{printf "PID: "$2 " CPU:" $3 "%--->"}for (i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}',if后面使用双{}是为了将f or也连接在一起,当第一个if成立后面的for才会执行,如果是一个{}那么不管条件成不成立都会全部打印一下最后一列 也可以直接这看 ps aux | awk '{if($3>0.1){print $0}}' | head -10 8.memtop10实现思路和cputop10一样 9.网卡流量 1M=1024Kb/8bit=128KB 网卡流量中RX是接受,TX是发送,6和7的位置不同,6中RX、TX位于第8行,RX是第4列,TX是低9列,而7中RX位于第五行TX位于第7行都是第5列 也可以根据RX或者TX查找 RX=ifconfig ens33 | awk '/bytes/{if(NR==5){print $5} else if(NR==8){print $4}}' TX=ifconfig ens33 | awk '/bytes/{if(NR==7){print $5} else if(NR==8){print $9}}' 网络流量实现方式 首先写一个死循环,使用read提示用户检查那块网卡的流量,用户输的网卡存在则跳出循环,在写一个循环,循环三次,其中先定义rx和tx的值,然后sleep 1秒在重新定义一个值,因为每秒都会发生改变,最后定义IN的变量(也就是RX)用一秒后的值减去1秒前的值除于1024在除于128,除于1024是为了得到Kb除于128是为了得出多少M最后打印出RX的值和TX的值
}}' | head -10 8.memtop10实现思路和cputop10一样 9.网卡流量 1M=1024Kb/8bit=128KB 网卡流量中RX是接受,TX是发送,6和7的位置不同,6中RX、TX位于第8行,RX是第4列,TX是低9列,而7中RX位于第五行TX位于第7行都是第5列 也可以根据RX或者TX查找 RX=ifconfig ens33 | awk '/bytes/{if(NR==5){print } else if(NR==8){print }}' TX=ifconfig ens33 | awk '/bytes/{if(NR==7){print } else if(NR==8){print }}' 网络流量实现方式 首先写一个死循环,使用read提示用户检查那块网卡的流量,用户输的网卡存在则跳出循环,在写一个循环,循环三次,其中先定义rx和tx的值,然后sleep 1秒在重新定义一个值,因为每秒都会发生改变,最后定义IN的变量(也就是RX)用一秒后的值减去1秒前的值除于1024在除于128,除于1024是为了得到Kb除于128是为了得出多少M最后打印出RX的值和TX的值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
3.整个脚本实现方式
#!/bin/bash #系统性能分析工具 #检测操作系统版本 YELLOW_COLOR='\e[033m' #黄 RED_COLOR='\e[031m' #红 GREEN_COLOR='\e[032m' #绿 BLUE_COLOR='\e[034m' #蓝 BLACK_COLOR='\e[0m' #黑 PINK_COLOR='\e[035m' #粉 os_check() { if [ -e /etc/redhat-release ];then LINUX1=$(cat /etc/redhat-release | cut -d' ' -f1) else LINUX2=$(cat /etc/issue | awk '{print }') fi if [ "$LINUX1" == "CentOS" -o "$LINUX1" == "RedHat" ];then P_M=yum elif [ "$LINUX2" == "Ubuntu" -o "$LINUX2" == "ubuntu" ];then P_M=apt-get else echo "error system" exit 1 fi } #检测是否是root登录的系统 if [ $LOGNAME != root ];then echo -e "${RED_COLOR}请使用root用户操作${BLACK_COLOR}" exit 2 fi #检测是否安装vmstat if ! which vmstat &>/dev/null;then echo -e "${RED_COLOR}vmstat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install vmstat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #检测是否安装iostat which iostat &>/dev/null if [ $? -ne 0 ];then echo -e "${RED_COLOR}iostat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install iostat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #使用select构造菜单并添加每个菜单需要执行的命令 while : do select menu in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic clearscreen quit do case $menu in cpu_load) #CPU利用率与负载 echo "------------------------------------" i=1 while [[ $i -le 3 ]] do echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" UTIL=`vmstat | awk '{if(NR==3){print 100-"%"}}'` #第15列是id对应的列,表示空闲的,用100减去空闲的就是已经使用的 USER=`vmstat | awk '{if(NR==3){print "%"}}'` #第13列是us对应的列,这里表示已使用的CPU中用户占用了多少 SYS=`vmstat |awk '{if(NR==3){print "%"}}'` #第14列是sy对应的列,这里表示已使用的CPU中系统占了多少 IOWAIT=`vmstat | awk '{if(NR==3){print $(NF -1)"%"}}'` #倒数第二列也就是16列,这里表示IOwait在cpu中占用了多少 echo "cpu used: $UTIL" echo "user used: $USER" echo "system used: $SYS" echo "io wait used: $IOWAIT" let i++ sleep 1 done echo "------------------------------------" break ;; disk_load) #磁盘I/O负载 echo "------------------------------------" i=1 while [[ $i -le 3 ]] do echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" UTIL=`iostat -d -x | awk '/^[s|v]/{OFS=": ";print ,$NF"%"}'` #util是IO消耗的CPU占比,-d,-x参数分别表示只列出磁盘和详细信息 READ=`iostat -d -x | awk '/^[s|v]/{OFS=": ";print ,"KB"}'` #打印出每秒向磁盘读多少字节数 WRITE=`iostat -d -x | awk '/^[s|v]/{OFS=":";print ,"KB"}'` #打印出每秒向磁盘写多少字节数 IOWAIT=`vmstat | awk '{if(NR==3){print $(NF-1)"%"}}'` echo -e "UTIL:" echo -e "${UTIL}" echo -e "io wait used: $IOWAIT" echo -e "Read/s: \n$READ" echo -e "Write/s: \n$WRITE" i=$(($i+1)) sleep 1 done echo "------------------------------------" break ;; disk_use) #磁盘使用率 DISK_LOG=/tmp/disk_user.log #磁盘使用日志存放路径 DISK_TOTAL=`fdisk -l | awk '/^Disk.*bytes/{print ,int()"GB"}'` #打印出磁盘对应的大小 DISK_USED=`df -h | awk '/^\/dev/{print int($(NF-1))}'` #打印出磁盘的使用率 for i in $DISK_USED #遍历一下,因为不止一块磁盘 do if [ $i -ge 90 ];then DISK_NAME=`df -h | awk '{if(int()=='''$i'''){print }}'` #如果第五列磁盘使用率等于循环中i的值那么就打印第六列 echo "${DISK_NAME} used is ${i}%..." >> $DISK_LOG #将磁盘的名字和使用率对应起来追加到日志中 fi done echo -e "disk total: \n${DISK_TOTAL}" if [ -e $DISK_LOG ];then echo "------------------------------------" df -h | awk '/^\/dev/{print ":",}' #如果使用了df -hT则先是, echo cat $DISK_LOG echo "------------------------------------" rm -rf $DISK_LOG else echo "------------------------------------" df -h | awk '/^\/dev/{print ":",}' #如果使用了df -hT则先是, echo echo -e "${BLUE_COLOR}Disk used no more than 90%...${BLACK_COLOR}" #当前磁盘使用率没有超过90%的 echo "------------------------------------" fi break ;; disk_inode) #磁盘inodes DKINODE_LOG=/tmp/disk_inode.log DISK_INODE=`df -i | akw '/^\/dev/{print int()}'` #df -i表示打印inode节点值 for i in $DISK_INODE do if [ $i -ge 90 ];then DISK_INODE_NAME=`df -i | awk '{if(int()=='''$i'''){print }}'` echo "$DISK_INODE_NAME inodes is ${i}%" >> $DKINODE_LOG fi done if [ -e $DKINODE_LOG ];then echo "------------------------------------" df -i | awk '/^\/dev/{print ":"}' echo cat $DKINODE_LOG echo "------------------------------------" else echo "------------------------------------" df -i | awk '/^\/dev/{print ":"}' echo echo -e "${BLUE_COLOR}Disk inodes no more than 90%...${BLACK_COLOR}" echo "------------------------------------" fi break ;; mem_use) MEM_TOTAL=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` #%.1f表示取小数点1位 MEM_USED=`free -m | awk '{if(NR==2){printf "%.1f",/1024}} END{print "G"}'` MEM_FREE=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` MEM_CACHE=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` echo "------------------------------------" echo -e "memory total is ${MEM_TOTAL}" echo -e "memory used is ${MEM_USED}" echo -e "memory free is ${MEM_FREE}" echo -e "memory cache is ${MEM_CACHE}" MEM_FREE_INT=`free -m | awk '{if(NR==2){printf "%d",/1024}}'` if [ $MEM_FREE_INT -le 0 ];then echo -en "${YELLOW_COLOR}mree memory is very low, if we need to clear the cache [y|n]: ${BLACK_COLOR}" read action case $action in y|Y) sync echo 3 > /proc/sys/vm/drop_caches echo -e "${PINK_COLOR}clear mem ok...${BLACK_COLOR}" ;; n|N) ;; esac fi echo "------------------------------------" break ;; tcp_status) #tcp连接状态 TCP_CONNECT=`netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}'` echo "------------------------------------" echo -e "${YELLOW_COLOR}tcp connection status: ${BLACK_COLOR} \n$TCP_CONNECT" echo "------------------------------------" break ;; cpu_top10) #查看占用cpu最高的前十个进程 echo "------------------------------------" CPU_LOG=/tmp/cpu_top10.log i=1 while [[ $i -le 3 ]] do ps aux | awk '{if(>0.1){{printf "PID: " " CPU: " "%----->"} for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' | sort -k4 -nr | head -10 >> $CPU_LOG #循环吃那个11列开始,如果i的值等于最后一列则换行,否则就一直打印直到最后一行 if [[ -n `cat $CPU_LOG` ]];then #查看日志中是否有文件 echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" cat $CPU_LOG > $CPU_LOG else echo -e "${RED_COLOR}No process using the CPU${BLACK_COLOR}" #没有进程使用CPU break fi let i++ sleep 1 done rm -rf $CPU_LOG echo "------------------------------------" break ;; mem_top10) #查看占用内存最高的前十个进程 echo "------------------------------------" MEM_LOG=/tmp/mem_top10.log i=1 while [[ $i -le 3 ]] do ps aux | awk '{if(>0.1){{printf "PID: " " MEM: " "%----->"} for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' | sort -k4 -nr | head -10 > $MEM_LOG if [[ -n `cat $MEM_LOG` ]];then echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" cat $MEM_LOG > $MEM_LOG else echo -e "${RED_COLOR}No process using the memory${BLACK_COLOR}" fi let i++ sleep 1 done rm -rf $MEM_LOG echo "------------------------------------" break ;; traffic) #检测网络流量 while true ;do echo -en "${YELLOW_COLOR}请输入要检测的网卡名称:${BLACK_COLOR}" read network_cord NET_CORD_EX=`ifconfig | grep -c "$network_cord"` #if [ `ifconfig | grep -c "$network_cord"` -eq 1 ];then if [ $NET_CORD_EX -eq 1 ];then break else echo -e "${RED_COLOR}没有 '${network_cord}' 这块网卡,请重新输入${BLACK_COLOR}" fi done echo "------------------------------------" echo -e "${BLUE_COLOR}IN------OUT${BLACK_COLOR}" i=1 while [[ $i -le 3 ]] do #centos6/7中ifconfig显示的内容略有差异 #centos6中rx与tx行号位于8 rx是接收也就是in #centos7中rx位于5,tx位于7 tx是发送也就是out RX_IN=`ifconfig $network_cord | awk '/bytes/{if(NR==5){print } else if(NR==8){print }}'` TX_OUT=`ifconfig $network_cord | awk '/bytes/{if(NR==7){print } else if(NR==8){print }}'` sleep 1 RX_IN_NEW=`ifconfig $network_cord | awk '/bytes/{if(NR==5){print } else if(NR==8){print }}'` TX_OUT_NEW=`ifconfig $network_cord | awk '/bytes/{if(NR==7){print } else if(NR==8){print }}'` IN=`awk 'BEGIN{printf "%.1f",'$(($RX_IN_NEW-$RX_IN))'/1024/128}'` OUT=`awk 'BEGIN{printf "%.1f",'$(($TX_OUT_NEW-$TX_OUT))'/1024/128}'` echo -e "${PINK_COLOR}RX IN is ${IN}MB/s,TX OUT is ${OUT}MB/s${BLACK_COLOR}" let i++ sleep 1 done echo "------------------------------------" break ;; clearscreen) clear break ;; quit) exit 3 ;; *) echo "enter number" ;; esac done done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
4.改造成函数
4.1函数文件内容
#!/bin/bash #系统性能分析工具 #检测操作系统版本 os_check() { if [ -e /etc/redhat-release ];then LINUX1=$(cat /etc/redhat-release | cut -d' ' -f1) else LINUX2=$(cat /etc/issue | awk '{print }') fi if [ "$LINUX1" == "CentOS" -o "$LINUX1" == "RedHat" ];then P_M=yum elif [ "$LINUX2" == "Ubuntu" -o "$LINUX2" == "ubuntu" ];then P_M=apt-get else echo "error system" exit 1 fi } cpu_load_fy() { #CPU负载 echo "------------------------------------" i=1 while [[ $i -le 3 ]] do echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" UTIL=`vmstat | awk '{if(NR==3){print 100-"%"}}'` #第15列是id对应的列,表示空闲的,用100减去空闲的就是已经使用的 USER=`vmstat | awk '{if(NR==3){print "%"}}'` #第13列是us对应的列,这里表示已使用的CPU中用户占用了多少 SYS=`vmstat |awk '{if(NR==3){print "%"}}'` #第14列是sy对应的列,这里表示已使用的CPU中系统占了多少 IOWAIT=`vmstat | awk '{if(NR==3){print $(NF -1)"%"}}'` #倒数第二列也就是16列,这里表示IOwait在cpu中占用了多少 echo "cpu used: $UTIL" echo "user used: $USER" echo "system used: $SYS" echo "io wait used: $IOWAIT" let i++ sleep 1 done echo "------------------------------------" break } disk_load_fy() { #磁盘I/O负载 echo "------------------------------------" i=1 while [[ $i -le 3 ]] do echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" UTIL=`iostat -d -x | awk '/^[s|v]/{OFS=": ";print ,$NF"%"}'` #util是IO消耗的CPU占比,-d,-x参数分别表示只列出磁盘和详细信息 READ=`iostat -d -x | awk '/^[s|v]/{OFS=": ";print ,"KB"}'` #打印出每秒向磁盘读多少字节数 WRITE=`iostat -d -x | awk '/^[s|v]/{OFS=":";print ,"KB"}'` #打印出每秒向磁盘写多少字节数 IOWAIT=`vmstat | awk '{if(NR==3){print $(NF-1)"%"}}'` echo -e "UTIL:" echo -e "${UTIL}" echo -e "io wait used: $IOWAIT" echo -e "Read/s: \n$READ" echo -e "Write/s: \n$WRITE" i=$(($i+1)) sleep 1 done echo "------------------------------------" break } disk_use_fy() { #磁盘使用率 DISK_LOG=/tmp/disk_user.log #磁盘使用日志存放路径 DISK_TOTAL=`fdisk -l | awk '/^Disk.*bytes/{print ,int()"GB"}'` #打印出磁盘对应的大小 DISK_USED=`df -h | awk '/^\/dev/{print int($(NF-1))}'` #打印出磁盘的使用率 for i in $DISK_USED #遍历一下,因为不止一块磁盘 do if [ $i -ge 90 ];then DISK_NAME=`df -h | awk '{if(int()=='''$i'''){print }}'` #如果第五列磁盘使用率等于循环中i的值那么就打印第六列 echo "${DISK_NAME} used is ${i}%..." >> $DISK_LOG #将磁盘的名字和使用率对应起来追加到日志中 fi done echo -e "disk total: \n${DISK_TOTAL}" if [ -e $DISK_LOG ];then echo "------------------------------------" df -h | awk '/^\/dev/{print ":",}' #如果使用了df -hT则先是, echo cat $DISK_LOG echo "------------------------------------" rm -rf $DISK_LOG else echo "------------------------------------" df -h | awk '/^\/dev/{print ":",}' #如果使用了df -hT则先是, echo echo -e "${BLUE_COLOR}Disk used no more than 90%...${BLACK_COLOR}" #当前磁盘使用率没有超过90%的 echo "------------------------------------" fi break } disk_inode_fy() { #磁盘inodes DKINODE_LOG=/tmp/disk_inode.log DISK_INODE=`df -i | akw '/^\/dev/{print int()}'` #df -i表示打印inode节点值 for i in $DISK_INODE do if [ $i -ge 90 ];then DISK_INODE_NAME=`df -i | awk '{if(int()=='''$i'''){print }}'` echo "$DISK_INODE_NAME inodes is ${i}%" >> $DKINODE_LOG fi done if [ -e $DKINODE_LOG ];then echo "------------------------------------" df -i | awk '/^\/dev/{print ":"}' echo cat $DKINODE_LOG echo "------------------------------------" else echo "------------------------------------" df -i | awk '/^\/dev/{print ":"}' echo echo -e "${BLUE_COLOR}Disk inodes no more than 90%...${BLACK_COLOR}" echo "------------------------------------" fi break } mem_use_fy() { MEM_TOTAL=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` #%.1f表示取小数点1位 MEM_USED=`free -m | awk '{if(NR==2){printf "%.1f",/1024}} END{print "G"}'` MEM_FREE=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` MEM_CACHE=`free -m | awk '{if(NR==2){printf "%.1f",/1024;print "G"}}'` echo "------------------------------------" echo -e "memory total is ${MEM_TOTAL}" echo -e "memory used is ${MEM_USED}" echo -e "memory free is ${MEM_FREE}" echo -e "memory cache is ${MEM_CACHE}" MEM_FREE_INT=`free -m | awk '{if(NR==2){printf "%d",/1024}}'` if [ $MEM_FREE_INT -le 0 ];then echo -en "${YELLOW_COLOR}mree memory is very low, if we need to clear the cache [y|n]: ${BLACK_COLOR}" read action case $action in y|Y) sync echo 3 > /proc/sys/vm/drop_caches echo -e "${PINK_COLOR}clear mem ok...${BLACK_COLOR}" ;; n|N) ;; esac fi echo "------------------------------------" break } tcp_status_fy() { #tcp连接状态 TCP_CONNECT=`netstat -ant | awk '/^tcp/{state[$NF]++} END{for (i in state){print i,state[i]}}'` echo "------------------------------------" echo -e "${YELLOW_COLOR}tcp connection status: ${BLACK_COLOR} \n$TCP_CONNECT" echo "------------------------------------" break } cpu_top10_fy() { #查看占用cpu最高的前十个进程 echo "------------------------------------" CPU_LOG=/tmp/cpu_top10.log i=1 while [[ $i -le 3 ]] do ps aux | awk '{if(>0.1){{printf "PID: " " CPU: " "%----->"} for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' | sort -k4 -nr | head -10 >> $CPU_LOG #循环吃那个11列开始,如果i的值等于最后一列则换行,否则就一直打印直到最后一行 if [[ -n `cat $CPU_LOG` ]];then #查看日志中是否有文件 echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" cat $CPU_LOG > $CPU_LOG else echo -e "${RED_COLOR}No process using the CPU${BLACK_COLOR}" #没有进程使用CPU break fi let i++ sleep 1 done rm -rf $CPU_LOG echo "------------------------------------" break } mem_top10_fy() { #查看占用内存最高的前十个进程 echo "------------------------------------" MEM_LOG=/tmp/mem_top10.log i=1 while [[ $i -le 3 ]] do ps aux | awk '{if(>0.1){{printf "PID: " " MEM: " "%----->"} for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' | sort -k4 -nr | head -10 > $MEM_LOG if [[ -n `cat $MEM_LOG` ]];then echo -e "${GREEN_COLOR}参数值$i ${BLACK_COLOR}" cat $MEM_LOG > $MEM_LOG else echo -e "${RED_COLOR}No process using the memory${BLACK_COLOR}" fi let i++ sleep 1 done rm -rf $MEM_LOG echo "------------------------------------" break } traffic_fy() { #检测网络流量 while true ;do echo -en "${YELLOW_COLOR}请输入要检测的网卡名称:${BLACK_COLOR}" read network_cord NET_CORD_EX=`ifconfig | grep -c "$network_cord"` #if [ `ifconfig | grep -c "$network_cord"` -eq 1 ];then if [ $NET_CORD_EX -eq 1 ];then break else echo -e "${RED_COLOR}没有 '${network_cord}' 这块网卡,请重新输入${BLACK_COLOR}" fi done echo "------------------------------------" echo -e "${BLUE_COLOR}IN------OUT${BLACK_COLOR}" i=1 while [[ $i -le 3 ]] do #centos6/7中ifconfig显示的内容略有差异 #centos6中rx与tx行号位于8 rx是接收也就是in #centos7中rx位于5,tx位于7 tx是发送也就是out RX_IN=`ifconfig $network_cord | awk '/bytes/{if(NR==5){print } else if(NR==8){print }}'` TX_OUT=`ifconfig $network_cord | awk '/bytes/{if(NR==7){print } else if(NR==8){print }}'` sleep 1 RX_IN_NEW=`ifconfig $network_cord | awk '/bytes/{if(NR==5){print } else if(NR==8){print }}'` TX_OUT_NEW=`ifconfig $network_cord | awk '/bytes/{if(NR==7){print } else if(NR==8){print }}'` IN=`awk 'BEGIN{printf "%.1f",'$(($RX_IN_NEW-$RX_IN))'/1024/128}'` OUT=`awk 'BEGIN{printf "%.1f",'$(($TX_OUT_NEW-$TX_OUT))'/1024/128}'` echo -e "${PINK_COLOR}RX IN is ${IN}MB/s,TX OUT is ${OUT}MB/s${BLACK_COLOR}" let i++ sleep 1 done echo "------------------------------------" break }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
4.2脚本内容
#!/bin/bash #系统性能分析工具---函数实现 #检测操作系统版本 source /my_scripts/d12_xtxnfx/fun_system.fy YELLOW_COLOR='\e[033m' #黄 RED_COLOR='\e[031m' #红 GREEN_COLOR='\e[032m' #绿 BLUE_COLOR='\e[034m' #蓝 BLACK_COLOR='\e[0m' #黑 PINK_COLOR='\e[035m' #粉 #检测是否是root登录的系统 if [ $LOGNAME != root ];then echo -e "${RED_COLOR}请使用root用户操作${BLACK_COLOR}" exit 2 fi #检测是否安装vmstat if ! which vmstat &>/dev/null;then echo -e "${RED_COLOR}vmstat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install vmstat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #检测是否安装iostat which iostat &>/dev/null if [ $? -ne 0 ];then echo -e "${RED_COLOR}iostat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install iostat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #使用select构造菜单并添加每个菜单需要执行的命令 while : do select menu in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic clearscreen quit do case $menu in cpu_load) cpu_load_fy ;; disk_load) disk_load_fy ;; disk_use) disk_use_fy ;; disk_inode) disk_inode_fy ;; mem_use) mem_use_fy ;; tcp_status) tcp_status_fy ;; cpu_top10) cpu_top10_fy ;; mem_top10) mem_top10_fy ;; traffic) traffic_fy ;; clearscreen) clear break ;; quit) exit 3 ;; *) echo "enter number" ;; esac done done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
5.执行脚本显示所有内容
函数和5的是同一个文件
#!/bin/bash #系统性能分析工具 #执行显示所有内容 #检测操作系统版本 source /my_scripts/d12_xtxnfx/fun_system.fy YELLOW_COLOR='\e[033m' #黄 RED_COLOR='\e[031m' #红 GREEN_COLOR='\e[032m' #绿 BLUE_COLOR='\e[034m' #蓝 BLACK_COLOR='\e[0m' #黑 PINK_COLOR='\e[035m' #粉 #检测是否是root登录的系统 if [ $LOGNAME != root ];then echo -e "${RED_COLOR}请使用root用户操作${BLACK_COLOR}" exit 2 fi #检测是否安装vmstat if ! which vmstat &>/dev/null;then echo -e "${RED_COLOR}vmstat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install vmstat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #检测是否安装iostat which iostat &>/dev/null if [ $? -ne 0 ];then echo -e "${RED_COLOR}iostat 命令没有安装,现在开始安装...${BLACK_COLOR}" os_check $P_M -y install iostat if [ $? -eq 0 ];then echo "-------------------------------------------------------------" fi fi #使用select构造菜单并添加每个菜单需要执行的命令 echo -e "${YELLOW_COLOR}cpu_load${BLACK_COLOR}" cpu_load_fy echo echo echo -e "${YELLOW_COLOR}disk_load${BLACK_COLOR}" disk_load_fy echo echo echo -e "${YELLOW_COLOR}disk_use${BLACK_COLOR}" disk_use_fy echo echo echo -e "${YELLOW_COLOR}disk_inode${BLACK_COLOR}" disk_inode_fy echo echo echo -e "${YELLOW_COLOR}mem_use${BLACK_COLOR}" mem_use_fy echo echo echo -e "${YELLOW_COLOR}tcp_status${BLACK_COLOR}" tcp_status_fy echo echo echo -e "${YELLOW_COLOR}cpu_top10${BLACK_COLOR}" cpu_top10_fy echo echo echo -e "${YELLOW_COLOR}mem_top10${BLACK_COLOR}" mem_top10_fy echo -e "${YELLOW_COLOR}traffic${BLACK_COLOR}" traffic_fy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Linux Shell
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。