亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
1221
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小時內刪除侵權內容。