1. 程式人生 > >python腳本+iftop捕捉網卡帶寬峰值監控發送郵件通知(詳細解釋,適合python新司機上路)

python腳本+iftop捕捉網卡帶寬峰值監控發送郵件通知(詳細解釋,適合python新司機上路)

python+iftop監控網卡帶寬監控

剛剛.....就在剛剛,我給自己跪了。原本想運行crontab -e 添加一個任務定時來監控服務器網卡帶寬峰值,莫名其妙按了個r。沒錯!就是crontab -r 這種操做。原本30多條定時任務的配置記錄被清空了,還不帶備份。瞬間,懵逼了,這個是線上環境。

技術分享圖片

我不想說話,默默地開始搬磚,畢竟是自己刪的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新司機上路)