首頁 > 軟體

Linux基礎之-利用shell指令碼實現自動監控系統服務

2020-06-16 17:14:01

目的:監控叢集內nginx及nfs服務執行是否正常,如任一服務異常,則傳送郵件通知使用者

條件:  1. 主機及子機IP地址,hostname已確定;

     2. 主機與子機能夠免密通訊,即基於密匙通訊(相關命令:ssh-keygen;ssh-copy-id -i web1);

需要的檔案:

      1. Python郵件傳送工具;

     2. nfc.sh監控指令碼,監控nginx及nfs服務狀態,並呼叫mail傳送工具通知使用者;    

     3. nfc-install.sh監控部署指令碼,執行在主機,為子機組態檔,執行命令;

詳細程式碼:

1. 郵件傳送工具

將以下程式碼建立到“/usr/bin/mail”檔案內,並賦予執行許可權(chmod +x /usr/bin/mail)

 
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import smtplib
import email.mime.multipart
import email.mime.text

server = 'smtp.163.com'
port = '25'

def sendmail(server,port,user,pwd,msg):
    smtp = smtplib.SMTP()
    smtp.connect(server,port)
    smtp.login(user, pwd)
    smtp.sendmail(msg['from'], msg['to'], msg.as_string())
    smtp.quit()
    print('郵件傳送成功email has send out !')


if __name__ == '__main__':
    msg = email.mime.multipart.MIMEMultipart()
    msg['Subject'] = 'check your service of nginx and nfs'
    msg['From'] = 'python4_mail@163.com'
    msg['To'] = 'python4_recvmail@163.com'
    user = 'python4_mail'
    pwd = '123456789'
    content='%sn%s' %('n'.join(sys.argv[1:4]),' '.join(sys.argv[4:])) #格式處理,專門針對我們的郵件格式

    txt = email.mime.text.MIMEText(content, _charset='utf-8')
    msg.attach(txt)

    sendmail(server,port,user,pwd,msg)

python通過SMTP傳送郵件失敗:
錯誤1:smtplib.SMTPAuthenticationError: (550, b‘User has no permission‘)
     我們使用python傳送郵件時相當於自定義用戶端根據使用者名稱和密碼登入,然後使用SMTP服務傳送郵件,新註冊的163郵箱是預設不開啟用戶端授權的(對指定的郵箱大師用戶端預設開啟),因此登入總是被拒絕,解決辦法(以163郵箱為例):進入163郵箱-設定-用戶端授權密碼-開啟(授權碼是用於登入第三方郵件用戶端的專用密碼)
錯誤2:smtplib.SMTPAuthenticationError: (535, b‘Error: authentication failed‘)
    以163郵箱為例,在開啟POP3/SMTP服務,並開啟用戶端授權密碼時會設定授權碼,將這個授權碼代替smtplib.SMTP().login(user,password)方法中的password即可。

2. nfc.sh監控指令碼

 
#! /bin/bash

#nginx及nfs服務監控指令碼,如果異常,將傳送郵件通知
function monitor_nfc() {
systemctl status nginx
nginx=$?
systemctl status nfs
nfs=$?
clear
if [ $nginx -eq 0 ] && [ $nfs -eq 0 ]
        then
        msg="TIME:$(date +%F_%T)
            HOSTNAME:$(hostname)
            IPADDR:$(ifconfig |awk 'NR==2{print $2}')
            MSG:nginx.service and nfs.service is both running"
         echo msg
#        /usr/bin/mail $msg    #服務執行正常,不傳送郵件通知
elif [ $nginx -ne 0 ] && [ $nfs -eq 0 ]
        then
        msg="TIME:$(date +%F_%T)
             HOSTNAME:$(hostname)
             IPADDR:$(ifconfig |awk 'NR==2{print $2}')
             MSG:nginx.service is dead,nfs.service is running"
        echo $msg
        /usr/bin/mail $msg
elif [ $nginx -ne 0 ] && [ $nfs -ne 0 ]
        then
        msg="TIME:$(date +%F_%T)
             HOSTNAME:$(hostname)
             IPADDR:$(ifconfig |awk 'NR==2{print $2}')
             MSG:nginx.service and nfs.service is both dead"
        echo $msg
        /usr/bin/mail $msg
elif [ $nginx -eq 0 ] && [ $nfs -ne 0 ]
        then
        msg="TIME:$(date +%F_%T)
             HOSTNAME:$(hostname)
             IPADDR:$(ifconfig |awk 'NR==2{print $2}')
             MSG:nginx.service is running,nfs.service is dead"
        echo $msg
        /usr/bin/mail $msg

fi
}


monitor_nfc &>> /tmp/monitor.log

3. nfc-install監控部署指令碼

 
#! /bin/bash

#首先執行主機的nfc.sh服務監控指令碼
/root/nfc.sh

#然後將主機的服務監控指令碼nfc.sh和傳送郵件檔案上傳至web機器
for i in {134,135,136}
do
scp /root/nfc.sh 192.168.47.$i:/share/            #將主機的服務監控指令碼nfc.sh上傳至web機器
scp /usr/bin/mail 192.168.47.$i:/usr/bin/        #將傳送郵件檔案上傳至web機器
ssh root@192.168.47.$i chmod +x /share/nfc.sh        #增加nfc指令碼檔案的執行許可權
ssh root@192.168.47.$i chmod +x /usr/bin/mail        #增加傳送郵件檔案的執行許可權
ssh root@192.168.47.$i /share/nfc.sh            #執行nfc指令碼監控功能
done

ssh 192.168.47.133           #最終回到主機終端

詳見圖片

結果:

主機

子機1

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-05/144222.htm


IT145.com E-mail:sddin#qq.com