服務維護之crontab定時監測告警

項目維護中服務會不定時的出現異常,好比50二、40四、101等等,當工做任務繁重時又不能實時監測,而linux的運維者,逃脫不了定時任務的命題,最經常使用和快捷簡單的是crontab,在少許機器的狀況下,crontab效率仍是比較高和比較便捷。但當機器越多、應用越多的狀況下,繼續使用crontab進行定時任務的管理配置,那嚴重影響工做效率。但crontab執行後結果如何若是不登陸服務器通常不能實施感知,此時咱們能夠藉助python的郵件機制進行實時通知也能夠定時監測服務發出告警信息以便及時處理。html

郵件機制相關知識簡介

SMTP (Simple Mail Transfer Protocol)   郵件傳送代理 (Mail Transfer Agent,MTA) 程序使用SMTP協議來發送電郵到接收者的郵件服務器。SMTP協議只能用來發送郵件,不能用來接收郵件。大多數的郵件發送服務器 (Outgoing Mail Server) 都是使用SMTP協議。SMTP協議的默認TCP端口號是25。   SMTP協議的一個重要特色是它可以接力傳送郵件。它工做在兩種狀況下:一是電子郵件從客戶機傳輸到服務器;二是從某一個服務器傳輸到另外一個服務器。python

POP3 (Post Office Protocol) & IMAP (Internet Message Access Protocol)   POP協議和IMAP協議是用於郵件接收的最多見的兩種協議。幾乎全部的郵件客戶端和服務器都支持這兩種協議。   POP3協議爲用戶提供了一種簡單、標準的方式來訪問郵箱和獲取電郵。使用POP3協議的電郵客戶端一般的工做過程是:鏈接服務器、獲取全部信息並保存在用戶主機、從服務器刪除這些消息而後斷開鏈接。POP3協議的默認TCP端口號是110。   IMAP協議也提供了方便的郵件下載服務,讓用戶能進行離線閱讀。使用IMAP協議的電郵客戶端一般把信息保留在服務器上直到用戶顯式刪除。這種特性使得多個客戶端能夠同時管理一個郵箱。IMAP協議提供了摘要瀏覽功能,可讓用戶在閱讀完全部的郵件到達時間、主題、發件人、大小等信息後再決定是否下載。IMAP協議的默認TCP端口號是143。 郵件格式 (RFC 2822)   每封郵件都有兩個部分:郵件頭和郵件體,二者使用一個空行分隔。   郵件頭每一個字段 (Field) 包括兩部分:字段名和字段值,二者使用冒號分隔。有兩個字段須要注意:From和Sender字段。From字段指明的是郵件的做者,Sender字段指明的是郵件的發送者。若是From字段包含多於一個的做者,必須指定Sender字段;若是From字段只有一個做者而且做者和發送者相同,那麼不該該再使用Sender字段,不然From字段和Sender字段應該同時使用。   郵件體包含郵件的內容,它的類型由郵件頭的Content-Type字段指明。RFC 2822定義的郵件格式中,郵件體只是單純的ASCII編碼的字符序列。 MIME (Multipurpose Internet Mail Extensions) (RFC 1341)   MIME擴展郵件的格式,用以支持非ASCII編碼的文本、非文本附件以及包含多個部分 (multi-part) 的郵件體等。linux

Python郵件處理機制

Python smtplib模塊   該模塊定義了一個SMTP客戶端會話對象,可用於使用SMTP或ESMTP偵聽器守護程序向任何互聯網機器發送郵件。 用來建立一個SMTP對象,稍後將演示如何用它來發送電子郵件api

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
複製代碼

這裏是上面語法的參數細節bash

  • host - 這是運行SMTP服務器的主機。能夠指定主機的IP地址或相似yiibai.com的域名。這是一個可選參數。
  • port - 若是提供主機參數,則須要指定SMTP服務器正在偵聽的端口。一般這個端口默認值是:25。
  • local_hostname - 若是SMTP服務器在本地計算機上運行,那麼能夠只指定localhost選項。
  • SMTP對象有一個sendmail的實例方法,該方法一般用於執行郵件發送的工做。它須要三個參數
    • sender - 具備發件人地址的字符串。
    • receivers - 字符串列表,每一個收件人一個。
    • message - 做爲格式如在各類RFC中指定的字符串。

Python email模塊服務器

  • class email.message.Message getitem,__setitem__實現obj[key]形式的訪問。 Msg.attach(playload): 向當前Msg添加playload。 Msg.set_playload(playload): 把整個Msg對象的郵件體設成playload。 Msg.add_header(_name, _value, **_params): 添加郵件頭字段。
  • class email.mime.base.MIMEBase(_maintype, _subtype, **_params) 全部MIME類的基類,是email.message.Message類的子類。
  • class email.mime.multipart.MIMEMultipart() 在3.0版本的email模塊 (Python 2.3-Python 2.5) 中,這個類位於 email.MIMEMultipart.MIMEMultipart。 這個類是MIMEBase的直接子類,用來生成包含多個部分的郵件體的MIME對象。
  • class email.mime.text.MIMEText(_text) 使用字符串_text來生成MIME對象的主體文本。

郵件發送實例

# -*- coding=utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
#163smtp服務器,須要設置POP3端口並設置受權碼
host_server = 'smtp.163.com'
#sender_user爲發件人郵箱號
sender_user = 'xxx@163.com'
#pwd爲發件人郵箱的受權碼
pwd = 'xxxx' 
#發件人的郵箱
sender_user_mail = 'xxx@163.com'
#收件人郵箱
receiver = 'xxx@qq.com'
#郵件的正文內容
mail_content = '你好,這是使用python登陸並驗證mail模塊功能發郵件的測試'
#郵件標題
mail_title = 'TEST郵件'
#ssl登陸
def send_mail(mail_content,mail_tile):
    smtp = SMTP_SSL(host_server)
    #set_debuglevel()是用來調試的。參數值爲1表示開啓調試模式,參數值爲0關閉調試模式
    smtp.ehlo(host_server)
    smtp.login(sender_user, pwd)
    msg = MIMEText(mail_content, "plain", 'utf-8')
    msg["Subject"] = Header(mail_title, 'utf-8')
    msg["From"] = sender_user_mail
    msg["To"] = receiver
    smtp.sendmail(sender_user_mail, receiver, msg.as_string())
    smtp.quit()
複製代碼

檢測服務是否正常實例

def test_server_status():
    apiUrl = 'www.baidu.com'
    try :
        # message = "OK"
        res = requests.get(apiUrl, verify = False)
        return str(res.status_code),str(res.content.decode("utf-8"))
    except Exception as e:
        import re
        m = re.search(r'(\[*[0-9]+\])', str(e), re.M | re.I)
        if m:
            status_code = m.group().split(']')[0]
            return status_code,e
複製代碼

crontab 定時監測任務

添加定時任務,實時監測服務狀態,當服務狀態出現錯誤時,發送郵件並告知維護人員簡單信息。至此一個簡單的定時監測服務告警任務就大功告成了。運維

相關文章
相關標籤/搜索