天天看點

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

重要性能監測工具:top、vmstat、w、uptime、ps、free、iostat、netstat、/proc等

需要監視Linux伺服器的性能?大多數Linux發行版都內建了一些監視工具。這些工具可以擷取有關系統活動的資訊的詳細名額。通過這些工具,你可以發現産生系統性能問題可能存在原因。下面讨論的是一些最基本的指令,它涉及到系統分析和調試伺服器等一些問題,如:

1.    找出系統瓶頸問題.

2.    磁盤 (儲存) 瓶頸問題.

3.    CPU和記憶體瓶頸問題.

4.    網絡瓶頸問題.

# 1: top – 檢視活動程序的指令########################################

TOP工具能夠實時顯示系統中各個程序的資源占用狀況。預設情況下,它将顯示系統中CPU最“敏感”的任務清單.該指令可以按CPU/記憶體的使用情況和執行時間對任務進行排序,并每五秒鐘更新一次。

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

常用的快捷鍵

Top指令為我們提供了很多有用的快捷鍵,如:

快捷鍵    用法

t           切換顯示程序和CPU狀态資訊。

m           切換顯示程序和CPU狀态資訊。

A           分類顯示各種系統資源的消耗情況。可用于快速識别系統的性能要求極高的任務。

o           改變顯示項目的順序。

r     重新設定程序的優先級别。(系統提示使用者輸入需要改變的程序PID以及需要設定的優先級值。)

k            終止一個程序。(系統将提示使用者輸入需要終止的程序PID)

s            改變重新整理的時間間隔。

u            檢視指定使用者的程序。

# 2: vmstat – 系統活動、硬體以及系統資訊

這個指令用來報告關于核心線程、虛拟記憶體、磁盤、陷阱和CPU活動的統計資訊。

# vmstat 3                                                           
輸出樣例:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------           
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st            
0  0      0 2540988 522188 5130400    0    0     2    32    4    2  4  1 96  0  0          
1  0      0 2540988 522188 5130400    0    0     0   720 1199  665  1  0 99  0  0          
0  0      0 2540956 522188 5130400    0    0     0     0 1151 1569  4  1 95  0  0          
0  0      0 2540956 522188 5130500    0    0     0     6 1117  439  1  0 99  0  0          
0  0      0 2540940 522188 5130512    0    0     0   536 1189  932  1  0 98  0  0          
0  0      0 2538444 522188 5130588    0    0     0     0 1187 1417  4  1 96  0  0          
0  0      0 2490060 522188 5130640    0    0     0    18 1253 1123  5  1 94  0  0      

顯示記憶體使用情況:

# vmstat –m 

# 3: w – 找到已登陸的使用者并且檢視他們做了什麼操作

W指令用來顯示機器上最近登陸的使用者資訊以及他們的程序資訊。

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

# 4: uptime – 系統已運作的時間

Uptime指令可以檢視系統已經運作了多長時間。截止目前時間日期,系統已經運作了多長時間,目前登入的使用者有哪些,已經在過去的1,5,15分鐘,系統的平均負載值情況。

# uptime                                                             
18:02:41 up 41 days, 23:42,  1 user,  load average: 0.00, 0.00, 0.00      

通常被認為是最佳的負載值。系統負載值根據系統的不同而不同。對于單CPU的系統,負載值在1-3為正常,SMP的系統,負載值在6-10之間也是可以接受的。

# 5: ps – 顯示程序

ps指令用來報告目前程序的快照。要選擇所有程序,使用-ef選項:

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

隻顯示lighttpd的程序樹:

# pgrep lighttpd                                                  

Or

# pgrep -u vivek php-cgi                                          

顯示pid為55977的程序名:

# ps -p 55977 -o comm=                                            

找出最耗費記憶體的前10個程序:

# ps -auxf | sort -nr -k 4 | head -10                             

找出最耗費CPU的前10個程序:

# ps -auxf | sort -nr -k 3 | head -10

# 6: free – 檢視記憶體的使用情況

free指令會顯示記憶體的使用情況,包括實體記憶體,虛拟的交換檔案記憶體,共享記憶體區段,以及系統核心使用的緩沖區.

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

free的輸出一共有四行,第四行為交換區的資訊,分别是交換的總量(total),使用量(used)和有多少空閑的交換區(free)。

第二行和第三行是比較讓人迷惑的。這兩行都是說明記憶體使用情況的。第一列是總量(total),第二列是使用量(used),第三列是可用量(free)。第一行的輸出時從作業系統(OS)來看的。

# 7: iostat – 監視CPU平均負載值,I/O狀态

該指令用于報告CPU和輸入/輸出裝置,分區和網絡檔案系統(NFS)的詳細統計資料。

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

基本使用如下:

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

參數 -d 表示,顯示裝置(磁盤)使用狀态;-k某些使用block為機關的列強制使用Kilobytes為機關;1 10表示,資料顯示每隔1秒重新整理一次,共顯示10次。

# 8: mpstat – 實時系統監視工具

mpstat是MultiProcessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中。在多CPUs系統裡,其不但能檢視所有CPU的平均狀況資訊,而且能夠檢視特定CPU的資訊。

下面隻介紹mpstat與CPU相關的參數,mpstat的文法如下:

Usage: mpstat [ options... ] [ <interval> [ <count> ] ]           

Options are:                                                  

[ -P { <cpu> | ALL } ] [ -V ]                                     

顯示每個程序對CPU的平均使用率:

# mpstat -P ALL

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

#9: pmap – 檢視程序使用記憶體的情況

pmap指令用來報告程序使用對于的相應記憶體的情況。使用下面指令可以查出某些記憶體瓶頸問題的原因。

# pmap -d PID                           

顯示程序号為47394的程序所用記憶體的資訊,最後一行非常重要。

# pmap -d 47394  

linux系統監控工具彙總及幾個小腳本 , 系統初始化腳本

#11 & #12 : netstat 和 ss – 檢視網絡情況

netstat指令顯示網絡連接配接,路由表,網絡接口統計,僞裝連接配接,多點傳播成員身份。ss指令類似netstat指令的資訊。            

#13: iptraf – 實時網絡狀況監視工具

iptraf是一款彩色的互動式的IP區域網路監控工具。這是一個基于ncurses的IP LAN監視工具,它會統計網絡中産生的各種資料,包括TCP資訊,UDP連接配接數,ICMP和OSPF資訊,以太網負載資訊,節點統計,IP校驗和錯誤,以及其他資訊。并且提供:

Network traffic statistics by TCP connection

IP traffic statistics by network interface

Network traffic statistics by protocol

Network traffic statistics by TCP/UDP port and by packet size

Network traffic statistics by Layer2 address

#14: tcpdump – 網絡狀況分析工具

tcpdump用來抓包的一個的簡單指令。但是,要使用該工具,你需熟悉TCP /IP協定。例如:顯示網絡中有關DNS的資訊,請輸入:

# tcpdump -i eth1 'udp port 53'     

顯示去往202.54.1.5的所有ftp會話資訊:

# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'   

顯示去往192.168.1.5的所有HTTP會話資訊:

# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'                

使用Wireshark檢視tcpdump抓封包件的詳細資訊,輸入:

# tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80  

#15: strace – 系統調用工具

strace是Linux環境下的一款程式調試工具,用來監察一個應用程式所使用的系統呼叫及它所接收的系統資訊。strace是一個有用的小工具,它可以通過跟蹤系統調用來讓你知道一個程式在背景所做的事情。Strace是一個基礎的調試工具,在大多數 Linux系 統上預設已經安裝;但是即便你不是在跟蹤一個問題的時候它也是一個極好的軟體。它能告訴你很多關于一個Linux程式怎樣工作的資訊。

#16: /Proc 檔案系統

Linux 核心提供了一種通過 /proc 檔案系統,在運作時通路核心内部資料結構、改變核心設定的機制。幾個例子:

# cat /proc/cpuinfo                                                

# cat /proc/meminfo                                                

# cat /proc/zoneinfo                   

# cat /proc/mounts  

#17: Nagios – 伺服器和網絡資訊監視工具

Nagios是一款很流行的開源系統和網絡監控應用軟體。你可以很輕松地用它監控所有的主機,網絡裝置和服務。在系統或服務狀态異常時會第一時間通知網站運維人員(發出郵件或短信報警),在狀态恢複正常後發出郵件或短信通知。

#18: Cacti -基于WEB的監視工具

Cacti是通過 snmpget來擷取資料,使用 RRDtool繪畫圖形,而且你完全可以不需要了解RRDtool複雜的參數。它提供了非常強大的資料和使用者管理功能,可以指定每一個使用者能檢視樹狀結構、host以及任何一張圖,還可以與LDAP結合進行使用者驗證,同時也能自己增加模闆,功能非常強大完善。界面友好。CACTI軟體Cacti 的發展是基于讓 RRDTool 使用者更友善使用該軟體,除了基本的 Snmp 流量跟系統資訊監控外,Cacti 也可外挂 Scripts 及加上 Templates 來作出各式各樣的監控圖。

#19: KDE System Guard – 圖形化的系統監視工具

KDE System Guard (KSysguard)是KDE的任務管理和性能監控工具。它采用client/server架構,可以監控本機也可以監控遠端主機。

一篇51CTOblog博文,對KDE System Guard的介紹很詳細:http://linuxshow.blog.51cto.com/1572053/371657 

#sar - 收集和報告系統狀态資訊

使用 sar -d 可以得到當天磁盤活動的情況彙總

sar -n  DEV 則能給出網絡接口的統計資訊

sar -A 可以報告所有的資訊

sar 适用于快速粗略了解曆史資訊。

sar 指令行的常用格式: sar [options] [-o file] t [n]

options 為指令行選項,sar指令的選項很多,下面隻列出常用選項: 

-A:所有報告的總和。        

-u:CPU使用率        

-v:程序、I節點、檔案和鎖表狀态。        

-d:硬碟使用報告。        

-r:沒有使用的記憶體頁面和硬碟塊。        

-g:序列槽I/O的情況。 

-b:緩沖區使用情況。 

-a:檔案讀寫情況。 

-c:系統調用情況。 

-R:程序的活動情況。 

-y:終端裝置活動情況。 

-w:系統交換活動。 

可以參考:http://linuxtools-rst.readthedocs.org/zh_CN/latest/tool/sar.html 

其他工具:

nmap – 掃描主機的端口開放情況.

lsof - 列出系統目前打開的檔案,網絡連接配接以及更多資訊。

ntop web based tool – Ntop是一款監控網絡流量工具,它顯示的網絡狀況更加直覺、詳細。Ntop甚至可以列出每個節點計算機的網絡帶寬使用率。它是一個靈活的、功能齊全的,用來監控和解決區域網路問題的工具;可以自動從網絡中識别有用的資訊;将截獲的資料包轉換成易于識别的格式;對網絡環境中通信失敗的情況進行分析;探測網絡通信的時間和過程等。

Conky - Conky是x-window下,一款免費的,輕量級系統監控的工具。它能夠監控許多系統環境的狀态,其中包括的CPU,記憶體,交換空間,磁盤存儲,溫度,程序,網絡接口,電池電量,系統消息,電子郵件收件箱等。

GKrellM – 它來用于監測CPU狀态,記憶體,硬碟,網絡接口,本地和遠端郵箱,以及其他的東西等。

vnstat – vnstat是一個基于控制台的網絡流量監控軟體,它會保持每月,每天,每小時,監視并記錄所標明網絡接口的網絡通信狀況。

htop – htop是一個增強版本的top,同時也是一個互動式程序檢視器,它可以以樹狀結構來顯示程序清單。

mtr – mtr在單一的網絡診斷工具上,結合了traceroute和ping程式的功能。

性能監控腳本

[root@testredis scripts]# cat performance.sh 
#!/bin/bash

#監控cpu系統負載
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "` 
cpu_num=`grep -c 'model name' /proc/cpuinfo`
count_uptime=`uptime |wc -w`
load_15=`uptime | awk '{print $'$count_uptime'}'`
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`  
average_int=`echo $average_load | cut -f 1 -d "."`  
load_warn=0.70  
if [ $average_int -gt 0 ]
then
echo "$IP伺服器單個核心15分鐘的平均負載為$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M:%S)" >>/usr/monitor/performance/performance_$(date +%Y%m%d).log
echo "$IP伺服器單個核心15分鐘的平均負載為$average_load,超過警戒值1.0,請立即處理!!!$(date +%Y%m%d/%H:%M:%S)" | mail -s "$IP伺服器系統負載嚴重告警" [email protected] 
else
echo "$IP伺服器單個核心15分鐘的平均負載值為$average_load,負載正常   $(date +%Y%m%d/%H:%M:%S)">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi

#監控cpu使用率
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`  
if [ $cpu_idle -lt 20 ]
then

echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log

echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理!!!" | mail -s "$IP伺服器cpu告警" [email protected] 
else

echo
"$IP伺服器cpu剩餘$cpu_idle%,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi      

程序監控

[root@testredis scripts]# cat process.sh 
#!/bin/bash
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`

tomcat_dir="/opt/apache-tomcat-7.0.8"
mysql_dir="/usr/local/mysql/bin/mysqld_safe"
vsftp_dir="/usr/sbin/vsftpd"
ssh_dir="/usr/sbin/sshd"

for dir in $tomcat_dir $mysql_dir $vsftp_dir  $ssh_dir 
do
process_count=$(ps -ef | grep "$dir" | grep -v grep | wc -l)

        for service in tomcat mysql vsftp ssh 
        do
                echo "$dir" |grep -q "$service"
                if [ $? -eq 0 ]
                then
                        if [ $process_count -eq 0 ]
                        then
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" | mail -s "$IP伺服器 $service服務關閉告警" [email protected] 
                        else
                            echo "$service is running at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                        fi
                else
                        continue
                fi
        done
done      

流量監控

#!/bin/bash
#
R1=`cat /sys/class/net/eth0/statistics/rx_bytes`
T1=`cat /sys/class/net/eth0/statistics/tx_bytes`
sleep 1
R2=`cat /sys/class/net/eth0/statistics/rx_bytes`
T2=`cat /sys/class/net/eth0/statistics/tx_bytes`
TBPS=`expr $T2 - $T1`
RBPS=`expr $R2 - $R1`
TKBPS=`expr $TBPS / 1024`
RKBPS=`expr $RBPS / 1024`
echo "上傳速率 eth0: $TKBPS kb/s 下載下傳速率 eth0: $RKBPS kb/s at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/network/network_$(date +%Y%m%d).log      

流量分析統計

[root@testredis scripts]# cat tongji.sh 
#!/bin/bash
TX=0;
RX=0;
MAX_TX=0;
MAX_RX=0;
while read line
do
        a=`echo $line | grep "eth0" |awk '{print $3}'`
if [ $a -ge 0 ]
then
        TX=$a
        if [ $TX -ge $MAX_TX ]
        then
                MAX_TX=$TX
        fi
fi
        b=`echo $line | grep "eth0" |awk '{print $7}'`
if [ $b -ge 0 ]
then
        RX=$b
        if [ $RX -ge $MAX_RX ]
        then
                MAX_RX=$RX
        fi
fi
done < /usr/monitor/network/network_$(date +%Y%m%d).log 
echo "最高上傳速度為 $MAX_TX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log
echo "最高下載下傳速度為 $MAX_RX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log      

記憶體硬碟登入使用者數監控

[root@Test scripts]# cat sys-warning.sh 
#!/bin/bash
#監控系統負載與CPU、記憶體、硬碟、登入使用者數,超出警戒值則發郵件告警。

#提取本伺服器的IP位址資訊
IP=`ifconfig eth0 | grep "inter addr" | cut -f 2 -d ":" | cut -f 1 -d " "`



# 1、監控系統負載的變化情況,超出時發郵件告警:

#抓取cpu的總核數
cpu_num=`cat /proc/cpuinfo | grep -c "model name"`

#抓取目前系統15分鐘的平均負載值
load_15=`uptime | awk '{print $12}'`

#計算目前系統單個核心15分鐘的平均負載值,結果小于1.0時前面個位數補0。
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" | bc`

#取上面平均負載值的個位整數
average_int=`echo $average_load | cut -f 1 -d "."`

#設定系統單個核心15分鐘的平均負載的告警值為0.70(即使用超過70%的時候告警)。
load_warn=0.70

#當單個核心15分鐘的平均負載值大于等于1.0(即個位整數大于0) ,直接發郵件告警;如果小于1.0則進行二次比較
if [ $average_int > 0 ]; then
echo "$IP伺服器單個核心15分鐘的系統平均負載為$average_load,超過警戒值1.0,請立即處理." | mutt -s "$IP 伺服器系統負載嚴重告警." [email protected]
else

#目前系統15分鐘平均負載值與告警值進行比較(當大于告警值0.70時會傳回1,小于時會傳回0)
load_now=`expr $average_load \> $load_warn`

#如果系統單個核心15分鐘的平均負載值大于告警值0.70(傳回值為1),則發郵件給管理者
if [ $load_now == 1 ]; then
echo "$IP伺服器單個核心15分鐘的系統平均負載為$average_load,超過警戒值0.70,請及時處理." | mutt -s "$IP 伺服器系統負載告警" [email protected]
fi
fi




# 2、監控系統cpu的情況,當使用超過80%的時候發告警郵件:

#取目前空閑cpu百份比值(隻取整數部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' | cut -f 1 -d "."`

#設定空閑cpu的告警值為20%,如果目前cpu使用超過80%(即剩餘小于20%),立即發郵件告警
if (($cpu_idle < 20)); then
echo "$IP伺服器cpu剩餘$cpu_idle%,使用率已經超過80%,請及時處理。" | mutt -s "$IP伺服器CPU告警" [email protected]
fi





# 3、監控系統交換分區swap的情況,當使用超過80%的時候發告警郵件:

#系統配置設定的交換分區總量
swap_total=`free -m | grep Swap | awk '{print $2}'`

#目前剩餘的交換分區free大小
swap_free=`free -m | grep Swap | awk '{print $4}'`

#目前已使用的交換分區used大小
swap_used=`free -m | grep Swap | awk '{print $3}'`

if (($swap_used != 0)); then
#如果交換分區已被使用,則計算目前剩餘交換分區free所占總量的百分比,用小數來表示,要在小數點前面補一個整數位0
swap_per=0`echo "scale=2;$swap_free/$swap_total" | bc`

#設定交換分區的告警值為20%(即使用超過80%的時候告警)。
swap_warn=0.20

#目前剩餘交換分區百分比與告警值進行比較(當大于告警值(即剩餘20%以上)時會傳回1,小于(即剩餘不足20%)時會傳回0 )
swap_now=`expr $swap_per \> $swap_warn`

#如果目前交換分區使用超過80%(即剩餘小于20%,上面的傳回值等于0),立即發郵件告警
if (($swap_now == 0)); then
echo "$IP伺服器swap交換分區隻剩下 $swap_free M 未使用,剩餘不足20%,使用率已經超過80%,請及時處理。" | mutt -s "$IP 伺服器記憶體告警" | [email protected]
fi
fi




# 4、監控系統硬碟根分區使用的情況,當使用超過80%的時候發告警郵件:

#取目前根分區(/dev/sda3)已用的百份比值(隻取整數部分)
disk_sda3=`df -h | grep /dev/sda3 | awk '{print $5}' | cut -f 1 -d "%"`

#設定空閑硬碟容量的告警值為80%,如果目前硬碟使用超過80%,立即發郵件告警
if (($disk_sda3 > 80)); then
echo "$IP 伺服器 /根分區 使用率已經超過80%,請及時處理." | mutt -s "$IP 伺服器硬碟告警" [email protected]
fi





#5、監控系統使用者登入的情況,當使用者數超過3個的時候發告警郵件:

#取目前使用者登入數(隻取數值部分)
users=`uptime | awk '{print $6}'`

#設定登入使用者數的告警值為3個,如果目前使用者數超過3個,立即發郵件告警
if (($users >= 3)); then
echo "$IP 伺服器使用者數已經達到$users個,請及時處理。" | mutt -s "$IP 伺服器使用者數告警" [email protected]
fi      
[root@Test scripts]# cat check_linux.sh 
#!/bin/bash

os_check() {
        if [ -e /etc/redhat-release ]; then
                REDHAT=`cat /etc/redhat-release |cut -d' '  -f1`
        else
                DEBIAN=`cat /etc/issue |cut -d' ' -f1`
        fi

        if [ "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then
                P_M=yum
        elif [ "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then
                P_M=apt-get
        else
                Operating system does not support.
                exit 1
        fi
}

if [ $LOGNAME != root ]; then
    echo "Please use the root account operation."
    exit 1
fi

if ! which vmstat &>/dev/null; then
        echo "vmstat command not found, now the install."
        sleep 1
        os_check
        $P_M install procps -y
        echo "-----------------------------------------------------------------------"
fi

if ! which iostat &>/dev/null; then
        echo "iostat command not found, now the install."
        sleep 1
        os_check
        $P_M install sysstat -y
        echo "-----------------------------------------------------------------------"
fi

 

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
        case $input in
            cpu_load)
                #CPU使用率與負載
                echo "---------------------------------------"
                i=1
                while [[ $i -le 3 ]]; do
                    echo -e "\033[32m  參考值${i}\033[0m"
                    UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
                    USER=`vmstat |awk '{if(NR==3)print $13"%"}'`
                    SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`
                    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                    echo "Util: $UTIL"
                    echo "User use: $USER"
                    echo "System use: $SYS"
                    echo "I/O wait: $IOWAIT"
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;

            disk_load)
                #硬碟I/O負載
                echo "---------------------------------------"
                i=1
                while [[ $i -le 3 ]]; do
                    echo -e "\033[32m  參考值${i}\033[0m"
                    UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`
                    READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`
                    WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`
                    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                    echo -e "Util:"
                    echo -e "${UTIL}"
                    echo -e "I/O Wait: $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_use.tmp
                DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&/\/dev/{printf $2" ";printf "%d",$3;print "GB"}'`
                USE_RATE=`df -h |awk '/^\/dev/{print int($5)}'`
                for i in $USE_RATE; do
                    if [ $i -gt 90 ];then
                        PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                        echo "$PART = ${i}%" >> $DISK_LOG
                    fi
                done
                echo "---------------------------------------"
                echo -e "Disk total:\n${DISK_TOTAL}"
                if [ -f $DISK_LOG ]; then
                    echo "---------------------------------------"
                    cat $DISK_LOG
                    echo "---------------------------------------"
                    rm -f $DISK_LOG
                else
                    echo "---------------------------------------"
                    echo "Disk use rate no than 90% of the partition."
                    echo "---------------------------------------"
                fi
                break
                ;;

            disk_inode)
                #硬碟inode使用率
                INODE_LOG=/tmp/inode_use.tmp
                INODE_USE=`df -i |awk '/^\/dev/{print int($5)}'`
                for i in $INODE_USE; do
                    if [ $i -gt 90 ]; then
                        PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                        echo "$PART = ${i}%" >> $INODE_LOG
                    fi
                done
                if [ -f $INODE_LOG ]; then
                    echo "---------------------------------------"
                    rm -f $INODE_LOG
                else
                    echo "---------------------------------------"
                    echo "Inode use rate no than 90% of the partition."
                    echo "---------------------------------------"
                fi
                break
                ;;

            mem_use)
                #記憶體使用率
                echo "---------------------------------------"
                MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`
                USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`
                FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`
                CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`
                echo -e "Total: $MEM_TOTAL"
                echo -e "Use: $USE"
                echo -e "Free: $FREE"
                echo -e "Cache: $CACHE"
                echo "---------------------------------------"
                break
                ;;

            tcp_status)
                #網絡連接配接狀态
                echo "---------------------------------------"
                COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`
                echo -e "TCP connection status:\n$COUNT"
                echo "---------------------------------------"
                ;;

            cpu_top10)
                #占用CPU高的前10個程序
                echo "---------------------------------------"
                CPU_LOG=/tmp/cpu_top.tmp
                i=1
                while [[ $i -le 3 ]]; do
                    #ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG
                    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}}' |sort -k4 -nr |head -10 > $CPU_LOG
                    #循環從11列(程序名)開始列印,如果i等于最後一行,就列印i的列并換行,否則就列印i的列
                    if [[ -n `cat $CPU_LOG` ]]; then
                       echo -e "\033[32m  參考值${i}\033[0m"
                       cat $CPU_LOG
                       > $CPU_LOG
                    else
                        echo "No process using the CPU." 
                        break
                    fi
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;

            mem_top10)
                #占用記憶體高的前10個程序
                echo "---------------------------------------"
                MEM_LOG=/tmp/mem_top.tmp
                i=1
                while [[ $i -le 3 ]]; do
                    #ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG
                    ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}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 "\033[32m  參考值${i}\033[0m"
                        cat $MEM_LOG
                        > $MEM_LOG
                    else
                        echo "No process using the Memory."
                        break
                    fi
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;

            traffic)
                #檢視網絡流量
                while true; do
                    read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth
                    #if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]]; then
                    if [ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]; then
                        break
                    else
                        echo "Input format error or Don't have the card name, please input again."
                    fi
                done
                echo "---------------------------------------"
                echo -e " In ------ Out"
                i=1
                while [[ $i -le 3 ]]; do
                    #OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`
                    #OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`
                    OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
                    #CentOS6和CentOS7 ifconfig輸出進出流量資訊位置不同,CentOS6中RX與TX行号等于8,CentOS7中RX行号是5,TX行号是5,是以就做了個判斷.       

                    OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
                    sleep 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}'`
                    IN=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`
                    OUT=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`
                    echo "${IN}MB/s ${OUT}MB/s"
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
                        quit)
                                exit 0
                                ;;
               *)
                    echo "---------------------------------------"
                    echo "Please enter the number." 
                    echo "---------------------------------------"
                    break
                    ;;
        esac
    done
done