python腳本+iftop捕捉網卡帶寬峰值監控發送郵件通知(詳細解釋,適合python新司機上路)
我不想說話,默默地開始搬磚,畢竟是自己刪的crontab,跪著也要找回來。
1、從日誌記錄中將今天內執行過的定時任務命令輸出到文檔a.txt
#cat /var/log/cron |awk '$1~/^Apr$/&&$2~/^25/' >>a.txt
匹配第一列是月份Apr 第二列是25 也就是今天內的日誌輸出到a.txt
2、看執行的命令和時間,去重,添加回去。
5分鐘時間,算是給恢復了,哎!自己挖坑,自己填,開心就好!
下次還是乖乖定時備份一下crontab吧
眼看還沒到下班時間,來更新一下許久未更新的博客。幹脆把python監控服務器網卡寬帶的腳本貼出來,給正在學python的新手們,指引前進的方向,從入門到放棄。
場景需求:我有一臺阿裏雲服務器,峰值是5M帶寬,阿裏雲自身已經提供完整的流量監控圖,奈何就是不提供當網卡帶寬達到閾值的時候,郵件通知。那就得徒手寫一個腳本,通過iftop捕捉網卡的峰值帶寬值,判斷如果小於5M,直接pass。萬一超了5M,就觸發郵件通知,檢查是業務量大了,還是流量異常。
有老司機可能會說,監控個網卡流量,上cacti,上nagios,上zabbix 吧啦吧啦.......這個看需求吧,如果是自建的IDC機器多,上zabbix,便於監控。只是一臺或數臺雲主機的話,上個腳本,定時捕捉一下快照就可以了,簡單,省事,還不耗服務器資源。
廢話少說了,還是來點實際的吧。上代碼.......
想起以前剛學python的時候,看別人的代碼,啥也看不懂。張三李四陳五王六,傻傻分不清楚,差點就放棄入門了。為了初學者能看明白,附上明細的註釋。
#!/usr/bin/env python #指定解釋器
#-*- encoding:utf-8 -*- #指定字符編碼,為了可以編碼下面的中文
#date:2018-04-25
#author:soul
import commands
import time
import os
import sys #導入以上幾個內置模塊
from smtp import smtp #從另一個python腳本smtp中導入smtp方法,用於發送郵件,smtp部分腳本可以看阿裏雲官方腳本
ip = 'xxxxxxxxx' #定義變量ip指定主機ip地址,便於在郵件中易讀
servername = "主機名稱" #定義變量servername指定主機名,便於在郵件中易讀
os.chdir('/tmp') #通過內置os模塊的chdir方法切換為tmp目錄下
def iftop_to_tmp_log(): #創建一個函數方法,名為iftop_to_tmp_log
try:
os.system('iftop -i eth0 -N -P -t -L 50 -s 20 > /tmp/iftop.log')
#通過內置模塊os的system方法,執行shell命令。運行iftop 獲取20s內的網卡數據輸出到tmp目錄的iftop.log文件中
time.sleep(2) #讓程序休眠2秒鐘,實際上沒什麽意義。純粹是累了,需要中場休息.......
except: #假設上面shell無法執行,自定義拋出異常
print "iftop -i eth0 is failure"
def compare_rate(): #創建一個函數方法,名為compare_rate自定義,作用為讀取iftop.log文件數據做判斷對比
if os.path.exists('/tmp/iftop.log') is True: #先判斷/tmp/iftop.log文件是否存在,如果不存在返回後面的else部分
(status, output) = commands.getstatusoutput("tail -n 4 iftop.log |grep 'Peak' |awk {'print $4,$5'}")
#指定變量status,output接收內置模塊commands,getstatusoutput方法執行shell命令用awk切割第4 5列的數據
#對應的是發送和接收的峰值rate數據 760Kb 1.80Mb
#iftop.log源文件數據為Peak rate (sent/received/total): 760Kb 1.80Mb 2.54Mb
T_sent = output.split()[0] #定義變量T_sent接收切割出來的數據組[760Kb,1.80Mb]的第一位即760Kb 備註:python第一位是從0開始的
R_receive = output.split()[1] #定義變量R_receive接收切割出來的數據組列表[760Kb,1.80Mb]的第2位即1.80Mb
T_reat = T_sent[:-2] #定義變量T_reat截取T_sent即760Kb中除了後面兩位的數據即:760
T_unit = T_sent[-2::] #定義變量T_unit截取T_sent即760Kb中後面兩位的數據即:Kb 截取這個單位是由於可能存在Kb,Mb的兩種情況
R_reat = R_receive[:-2]#同上,截取接收的數據值
R_unit = R_receive[-2::]#同上,截取接收的數據單位
print "接收速率為%s:%s/s 發送速率為%s:%s/s " %(R_reat,R_unit,T_reat,T_unit) #打印以上截取到的收發數據和單位值
if R_unit =='Kb': #判斷,如果接收數據的單位為Kb,不做任何處理,畢竟還沒達到帶寬閾值。
print "當前接收速率為%sKb/s" %R_reat #前面的%s是一個字符串的占位符 用於接收後面傳入的參數值R_reat
else: #如果接收數據的單位不是Kb,那就是Mb了。本機阿裏雲買的是5M帶寬
if float(R_reat) <=5: #由於上面的數據有小數點,是浮點數,用float 當前判斷,如果單位為Mb,又小於5M,沒有達到閾值,不做告警通知
print "當前Incoming接收速率峰值在可允許範圍,接收速率為%sMb/s" %R_reat #純粹打印出來瞄一眼
else: #否則,如果接收的數據單位為Mb同時數據值又大於5,比當前購買的帶寬值大,則需要通知加帶寬了。
now_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #定於一個變量now_time 設定當前時間
title = "%s服務器帶寬均值異常通知" %servername #定義郵件的標題 將主機名servername作為參數傳入
content = "當前時間:%s host:%s servername:%s eth0網卡入口流量已超所購買帶寬5M上限,當前Incoming接收速率為%sMb/s,請檢查" %(now_time,ip,servername,R_reat)
#定義變量content指定郵件內容,將當前時間,主機ip,主機名傳入
nickname = "服務器帶寬流量監控服務" #定義變量nickname指定郵件昵稱
smtp(title,content,nickname) #調用頭部導入的郵件發送模塊smtp的smtp中的方法,將標題,內容,昵稱作為參數傳入
#不得不說用阿裏雲自帶的郵件服務就是溜得飛起,每天郵件隨便發,配置簡單,官網有完整的代碼文檔
if T_unit == 'Kb': #下面的所有判斷跟上面相同,上面是判斷接收部分的數據,下面判斷的是發送部分的數據
print "當前發送速率為%sKb/s" %T_reat
else:
if float(T_reat) <=5:
print "當前Outgoing發送速率均值在可允許範圍,發送速率為%sMb/s" %T_reat
else:
now_time=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
title = "%s服務器帶寬均值異常通知" %servername
content = "當前時間:%s host:%s servername:%s eth0網卡出口流量已超購買帶寬5M上限,當前Outgoing發送速率為%sMb/s,請檢查" %(now_time,ip,servername,T_reat)
nickname = "服務器帶寬流量監控服務"
smtp(title,content,nickname)
else:
print "The file iftop.log is not exists " #如果iftop.log文件不存在,打印提示
sys.exit() #退出
if __name__=='__main__':
iftop_to_tmp_log() #代碼首先執行函數iftop_to_tmp_log 捕捉網卡寬帶數據輸出到iftop.log文件
compare_rate() #然後執行函數compare_rate,從iftop.log中讀出數據並判斷,未達帶寬閾值不處理,超出閾值通知增加帶寬,或檢查是否有惡意攻擊,占用流量
sys.exit()
python腳本+iftop捕捉網卡帶寬峰值監控發送郵件通知(詳細解釋,適合python新司機上路)