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

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

下載.jpg

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章