需求:過百台服務器需要巡檢,考慮到人工巡檢太浪費時間,於是寫了如下腳本,每天定時統計各服務器資源使用情況,統一匯總到一台服務器,進行合並、轉換excel
1、shell腳本統計系統資源使用情況,,根據閾值判斷是否正常,生成txt文件

1 #!/bin/bash 2 #獲取主機名 3 system_hostname=$(hostname | awk '{print $1}') 4 5 #獲取服務器IP 6 system_ip=$(ifconfig eth0 |awk -F '[ :]+' 'NR==2{print $3}') 7 8 #獲取總內存 9 mem_total=$(free -m | grep Mem| awk -F " " '{print $2}') 10 11 #獲取剩余內存 12 mem_free=$(free -m | grep "Mem" | awk '{print $4+$6}') 13 14 #獲取已用內存 15 mem_use=$(free -m | grep Mem| awk -F " " '{print $3}') 16 17 #獲取當前平均一分鍾負載 18 load_1=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $1}'` 19 20 #獲取當前平均五分鍾負載 21 load_5=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $2}'` 22 23 #獲取當前平均十五分鍾負載 24 load_15=`top -n 1 -b | grep average | awk -F ':' '{print $5}' | sed -e 's/\,//g' | awk -F " " '{print $3}'` 25 26 #過濾磁盤使用率大於50%目錄,並加入描述 27 disk_1=$(df -Ph | awk '{if(+$5>50) print "分區:"$1,"總空間:"$2,"使用空間:"$3,"剩余空間:"$4,"磁盤使用率:"$5}') 28 29 #拆分 30 disk_fq=$(df -Ph | awk '{if(+$5>50) print "分區:"$1}') 31 disk_to=$(df -Ph | awk '{if(+$5>50) print "總空間:"$2}') 32 disk_us=$(df -Ph | awk '{if(+$5>50) print "使用空間:"$3}') 33 disk_fe=$(df -Ph | awk '{if(+$5>50) print "剩余空間:"$4}') 34 disk_ul=$(df -Ph | awk '{if(+$5>50) print "磁盤使用率:"$5}') 35 disk_ux=$(df -Ph | awk '{if(+$5>50) print $5}') 36 37 #文件路徑 38 path=/home/monitor_"$system_ip".txt 39 40 #內存閾值 41 mem_mo='50' 42 43 44 echo -e " " > $path 45 echo -e "主機名:"$system_hostname >> $path 46 echo -e "服務器IP:"$system_ip >> $path 47 if [[ $(echo $disk_ux | sed s/%//g) -gt 50 ]] 48 then 49 echo $disk_fq >>$path 50 echo $disk_to >>$path 51 echo $disk_us >>$path 52 echo $disk_fe >>$path 53 echo $disk_ul >>$path 54 echo 磁盤巡檢狀態:不正常 >>$path 55 else 56 echo $disk_fq >>$path 57 echo $disk_to >>$path 58 echo $disk_us >>$path 59 echo $disk_fe >>$path 60 echo $disk_ul >>$path 61 echo 磁盤巡檢狀態:正常 >>$path 62 fi 63 PERCENT=$(printf "%d%%" $(($mem_use*100/$mem_total))) 64 PERCENT_1=$(echo $PERCENT|sed 's/%//g') 65 if [[ $PERCENT_1 -gt $mem_mo ]] 66 then 67 echo -e 總內存大小:$mem_total MB>> $path 68 echo -e 已用內存:$mem_use MB >> $path 69 echo -e 內存剩余大小:$mem_free MB >> $path 70 echo -e 內存使用率:$PERCENT >> $path 71 echo -e 內存巡檢狀態:不正常 >> $path 72 else 73 echo -e 總內存大小:$mem_total MB>> $path 74 echo - 已用內存:$mem_use MB >> $path 75 echo -e 內存剩余大小:$mem_free MB >> $path 76 echo -e 內存使用率:$PERCENT >> $path 77 echo 內存巡檢狀態:正常 >> $path 78 fi 79 echo -e 平均1分鍾負載:$load_1"\n"平均5分鍾負載:$load_5"\n"平均15分鍾:$load_15 >> $path
執行效果:
主機名:i**** 服務器IP:172**** 分區:/dev/vda1 總空間:20G 使用空間:11G 剩余空間:7.9G 磁盤使用率:58% 磁盤巡檢狀態:不正常 總內存大小:3789 MB 已用內存:2117 MB 內存剩余大小:1672 MB 內存使用率:55% 內存巡檢狀態:不正常 平均1分鍾負載:0.07 平均5分鍾負載:0.03 平均15分鍾:0.05
2、python將txt文件轉換成excel,不正常巡檢結果標記紅色

1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 import xlwt 4 import datetime 5 style = "font:colour_index red; align: wrap on, vert centre, horiz center;" 6 styleb = xlwt.XFStyle() # 創建一個樣式對象,初始化樣式 7 al = xlwt.Alignment() 8 al.horz = 0x02 # 設置水平居中 9 al.vert = 0x01 # 設置垂直居中 10 styleb.alignment = al 11 red_style = xlwt.easyxf(style) 12 title_style = xlwt.easyxf('font: height 200, name Arial Black, colour_index blue, bold on; align: wrap on, vert centre, horiz center;' ) 13 def getlist(): # 讀取txt 14 with open('hebing.txt', 'r+',encoding='utf-8') as f: 15 s1 = f.readlines() 16 f.close() 17 s2 = [] 18 for i in s1: 19 if '\n' in i: 20 s2.append(i[:-1]) 21 else: 22 s2.append(i) 23 return s2 24 def fenge(): # 分割 25 list0 = [] # 存貯空格行 26 for num, val0 in enumerate(getlist()): 27 if val0.split(':')[0] == '主機名': 28 list0.append(num) 29 list0.append(len(getlist())) 30 list1 = [] # 存貯內容 31 for num1,val1 in enumerate(list0[1:]): 32 temp = getlist()[list0[num1]:list0[num1+1]] 33 list1.append(temp) 34 return list1 35 def wxls(): # 寫入表格 36 title = ['主機名','服務器IP','分區','總空間','使用空間','剩余空間','磁盤使用率','磁盤巡檢狀態','總內存大小', 37 '已用內存','內存剩余大小','內存使用率','內存巡檢結果','平均1分鍾負載','平均5分鍾負載','平均15分鍾', 'ceshi'] 38 workbook = xlwt.Workbook(encoding='utf-8') 39 worksheet = workbook.add_sheet('sheet1') 40 for i1, val in enumerate(title): 41 worksheet.write(0, i1, label=val,style = title_style) 42 first_col = worksheet.col(i1) 43 first_col.width = 180 * 20 44 for i2, val2 in enumerate(title): 45 for i3, val3 in enumerate(fenge()): 46 for j in val3: 47 if j.split(':')[0] == val2: 48 #print i2,i3,j.split(':')[1].decode('utf8') 49 if j.split(':')[1] == '不正常': 50 worksheet.write(i3 + 1, i2, label=j.split(':')[1],style=red_style) 51 else: 52 worksheet.write(i3+1, i2, label=j.split(':')[1] ,style = styleb) 53 name = 'miontior.xls' 54 workbook.save(name) 55 wxls()
執行效果: