shell系統監控及日志分析
系統監控: CPU相關信息在/proc/stat
內存/proc/meminfo
流量監控proc/net/dev
磁盤io/proc/vmstat
腳本代碼
1 #!/bin/bash
2 #監控linux主機系統信息
3 #導入工具模塊
4 source utils
5
6 #獲取CPU占用率
7 function cpuUsage()
8 {
9 #物理CPU個數
10 phyCPUNums=`cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l`
11 #邏輯CPU個數
12 lgCPUNums=`cat /proc/cpuinfo |grep "processor"|wc -l`
13 #core
14 cores=`cat /proc/cpuinfo |grep "cores"|uniq|awk '{print $4}'`
15 logInfo "Host [${ip}] physical CPU nums is : ${phyCPUNums}"
16 logInfo "Host [${ip}] logic CPU nums is : ${lgCPUNums}"
17 logInfo "Host [${ip}] core nums is : ${cores}"
18 #CPU占用率
19 #獲取CPU的總量與使用量
20 cpuTotalStart=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
21 cpuUsedStart=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
22 #隔30s再獲取一次CPU總量與使用量並計算差值
23 sleep 30
24 cpuTotalEnd=`awk 'BEGIN{total=0} /cpu / {for(i=2;i<=NF;i++);total+=i}END{print $total}' /proc/stat`
25 cpuUsedEnd=`awk 'BEGIN{used=0} /cpu / { used=$2+$3+$4+$7+$8 }END{print used}' /proc/stat`
26 usedCPU=`expr ${cpuUsedEnd} - ${cpuUsedStart}`
27 totalCPU=`expr ${cpuTotalEnd} - ${cpuTotalStart}`
28 logInfo "Host [${ip}] CPU usage is : $(usagePercent ${usedCPU} ${totalCPU}) %"
29
30 }
31
32 #獲取內存使用率
33 function memUsage(){
34 logInfo "Begin to get mem usage of Host [${ip}]"
35 #獲取總內存
36 totalMem=`awk '/MemTotal/{print $2}' /proc/meminfo`
37 #獲取空閑內存
38 freeMem=`awk '/MemFree/{print $2}' /proc/meminfo`
39 usedMem=`expr ${totalMem} - ${freeMem}`
40 #echo $(usagePercent ${usedMem} ${totalMem})
41 #echo $(kbToGb ${totalMem})
42 logInfo "Host [${ip}] total mem is : $(kbToGb ${totalMem}) GB"
43 #計算內存使用率並打印到日志中
44 logInfo "Host [${ip}] mem usage is : $(usagePercent ${usedMem} ${totalMem}) %"
45 logInfo "End to get mem usage of Host [${ip}]"
46 }
47
48 #網卡平均每秒流量
49 function netData(){
50 logInfo "Begin to get net data of Host [${ip}]"
51 ethName=$1
52 receiveByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
53 sendByteStart=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
54 sleep 10
55 receiveByteSEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $2}'`
56 sendBytesEnd=`cat /proc/net/dev |grep -E "${ethName}"|awk '{print $10}'`
57 inDataRate=$(echo "scale=2;(${receiveByteSEnd}-${receiveByteStart})/10" | bc)
58 outDataRate=$(echo "scale=2;(${sendBytesEnd}-${sendByteStart})/10" | bc)
59 logInfo "Host [${ip}] in data is : ${inDataRate} kb / s"
60 logInfo "Host [${ip}] out data is : ${outDataRate} kb / s"
61 logInfo "End to get net data of Host [${ip}]"
62 }
63
64 #磁盤空間使用情況
65 function diskUsage(){
66 logInfo "Begin to get disk usage of Host [${ip}]"
67 noTimeLogInfo "`df -h`"
68 logInfo "End to get disk usage of Host [${ip}]"
69 }
70
71 #disk IO in
72 function diskIOIn(){
73 #獲取磁盤入方向IO
74 inIoStart=`awk '/pgpgin/{print $2}' /proc/vmstat`
75 sleep 30
76 inIoEnd=`awk '/pgpgin/{print $2}' /proc/vmstat`
77 inIo=$(((inIoEnd-inIoStart)/(30*1024)))
78 logInfo "Host [${ip}] in IO is : ${inIo} MB / s"
79
80 }
81
82 #disk IO out
83 function diskIOout(){
84 #獲取磁盤出方向的IO
85 outIoStart=`awk '/pgpgout/{print $2}' /proc/vmstat`
86 sleep 60
87 outIoEnd=`awk '/pgpgout/{print $2}' /proc/vmstat`
88 outIo=$(((outIoEnd-outIoStart)/(60*1024)))
89 logInfo "Host [${ip}] out IO is : ${outIo} MB / s"
90 }
91
92 #當前在線用戶
93 function onlineUser(){
94 user=`w |awk 'NR>1'|awk '{print $1 "\t" "\t" $4}'`
95 userCount=`w |awk 'NR>1'|wc -l`
96 #loginAt=`w |awk 'NR>1'|awk '{print $4 }'`
97 logInfo "There are [${userCount}] users online now."
98 noTimeLogInfo "UserName loginAt"
99 noTimeLogInfo "${user}"
100 }
101
102 #判斷主機網絡連通性
103 function isAlive(){
104 for ip in `cat hostLists`
105 do
106 ping ${ip} -c 3 >/dev/null
107 if [ $? -eq 0 ];then
108 logInfo "${ip} is reachable"
109 #查看在線用戶
110 onlineUser
111 #獲取CPU相關信息
112 cpuUsage
113 #獲取mem相關信息
114 memUsage
115 #獲取磁盤IO
116 diskIOIn
117 diskIOout
118 #磁盤使用率
119 diskUsage
120 #平均每秒流接收或輸出流量
121 netData wlp3s0
122 else
123 logInfo "ERROR ${ip} is unreachable,try login in see more details.."
124 fi
125 done
126 }
127
128 while [ 1 ]
129 do
130 isAlive
131 sleep 60
132 done
打印日志函數
1 #!/bin/bash
2 #日志打印
3 curr_path=`pwd`
4 function logInfo()
5 {
6 local curr_time=`date "+%Y-%m-%d %H:%M:%S"`
7 log_file=${curr_path}/system_status.log
8 #判斷日志文件是否存在
9 if [ -e ${log_file} ]
10 then
11 #檢測文件是否可寫
12 if [ -w ${log_file} ]
13 then
14 #若文件無寫權限則使用chmod命令賦予權限
15 chmod 770 ${log_file}
16 fi
17 else
18 #若日志文件不存在則創建
19 touch ${log_file}
20 fi
21 #寫日志
22 local info=$1
23 echo "${curr_time} `whoami` [Info] ${info}">>${log_file}
24 }
25 function noTimeLogInfo(){
26 msg=$1
27 echo "${msg}">>${log_file}
28 }
29
30 #把kb轉換成gb,精度為3。expr只支持整數計算
31 function kbToGb(){
32 kbVal=$1
33 gbVal=$(echo "scale=3;${kbVal}/1024/1024"| bc)
34 echo $gbVal
35 }
36 #使用率以百分比的形式
37 #第一個參數為已使用量,第二個參數為總量
38 function usagePercent(){
39 used=$1
40 total=$2
41 usedPercent=$(echo "scale=2;${used}*100/${total}"| bc)
42 echo ${usedPercent}
43 }
