简单的进程监控脚本

简单的进程监控脚本

现有多台Linux服务器,其中一台连接了外网,其他服务器不允许连接外网,需求是监控所有服务器的进程和一些服务,有问题就发告警邮件。

将能连接外网的服务器做成服务端服务器,用来做发送邮件告警,python脚本如下:
Server.py:

#-*- coding:utf-8 -*-  

from SocketServer import ThreadingTCPServer, StreamRequestHandler  
import traceback  
import ConfigParser
import smtplib 
from email.mime.text import MIMEText  

config = ConfigParser.ConfigParser()
config.readfp(open("config_server.ini", "rb"))  
class MyStreamRequestHandlerr(StreamRequestHandler):  
    def handle(self):  
        while True:  
            try:  
                data = self.rfile.readline().strip() 
                if not data: 
                    break                 
                print "receive from (%r):%r" % (self.client_address, data)  
                client_address = list(self.client_address)
                client_address.append(data)
                self.wfile.write(data.upper())
                if 'Erro' in data:
                    send_mail(str(client_address))

            except:  
                traceback.print_exc()  
                break  


def send_mail(content):  

    mailto_str = config.get("global", "mailto")  #设置收件箱
    print(mailto_str)
    mailto_list = list(mailto_str.split(','))
    print(mailto_list)
    mail_host = config.get("global", "smtp")   #设置服务器
    mail_user = config.get("global", "user")    #用户名
    print(mail_user)
    mail_pass = config.get("global", "pass")   #口令       
    print(mail_pass)
    mail_theme = config.get("global", "theme") #设置邮件主题
    me="xxx@163.com" 
    msg = MIMEText(content,_subtype='plain',_charset='utf-8')  
    msg['Subject'] = mail_theme  
    msg['From'] = me  
    msg['To'] = ";".join(mailto_list)
    try:  
        server = smtplib.SMTP()  
        server.connect(mail_host)  
        server.login(mail_user,mail_pass)  
        server.sendmail(me, mailto_list, msg.as_string())  
        server.close()  
        return True  
    except Exception, e:  
        print str(e)  
        return False  

if __name__ == "__main__":  



    client_address = ''

    host = config.get("global", "ip")   
    port = config.get("global", "port")

    addr = (host, int(port))

    #ThreadingTCPServer从ThreadingMixIn和TCPServer继承  
    #class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass  
    server = ThreadingTCPServer(addr, MyStreamRequestHandlerr)  
    server.serve_forever() 

其中config_server.ini是配置文件,内容为:

[global]
;所有项均为必填项
;这是服务端,用于设置发送和接收邮箱

;服务端IP地址 
ip = xxx.xx.xx.xx

;服务端端口 
port = 19999

;邮件收件人地址,多个收件人用,隔开 
mailto = abc@163.com,def@163.com
;smtp设置
smtp = smtp.163.com

;用户名
user = aaa@163.com

;密码
pass = aaa123

;设置邮件主题
theme = SystemError

客户端服务器,即其他无法连接外网的服务器,运行脚本为Client.py
Client.py:

#-*- coding:utf-8 -*-

from socket import *
import ConfigParser
import subprocess
import time

#获取配置文件
config = ConfigParser.ConfigParser()
config.readfp(open("config_client.ini", "rb"))
#从配置文件中读取"地址","端口","进程名"
host =config.get("global", "ip")
port = config.get("global", "port")
process = config.get("global", "process")
disk_num = config.get("global", "disk_num")
sql = config.get("global", "sql")
ftp = config.get("global","ftp")
sleep_time = config.get("global", "sleep")
list =[]

#查询进程是否存在
def monitor_process(process):
    str = process.split(',')
    num = 0
    while (num <= len(str)-1):
        p=subprocess.Popen(["ps -ef |grep "+str[num]+"|grep -v grep"],shell=True,stdout=subprocess.PIPE)
        out=p.stdout.readlines()
        if not out:
            list.append(str[num]+" Erro!    ")
        num+=1

def monitor_disk(disk_num):
    p=subprocess.Popen(["df -P | grep /dev | awk '{print $5}' | sed 's/%//g' | sort -n | tail -n 1"],shell=True,stdout=subprocess.PIPE)
    out=p.stdout.readlines()
    if (int(out[0]) >= int(disk_num)):
        list.append("diskErro!   ")

def monitor_mysql():
    p=subprocess.Popen(["service mysqld status"],shell=True,stdout=subprocess.PIPE)
    out=p.stdout.readlines()
    if "OK" not in ''.join(out):
        list.append("MysqlErro!   ")

def monitor_ftp():
    p=subprocess.Popen(["service vsftpd status"],shell=True,stdout=subprocess.PIPE)
    out=p.stdout.readlines()
    if "running" not in ''.join(out):
        list.append("FtpErro!   ")

if __name__ == '__main__':
    while 1:
        if port is not '' and host is not '':
            if process is '':
                print "请设置监控进程"
            else:
                monitor_process(process)
            if disk_num is '':
                print "请设置硬盘监控阈值"
            else:
                monitor_disk(disk_num)
            if sql == '0':
                print "没有数据库"
            else:
                monitor_mysql()
            if ftp == '0':
                print "没有ftp服务"
            else:
                monitor_ftp()
            #发送消息
            if not list:
                print "is ok!"
            else:
                try:
                    addr = (host,int(port))
                    client = socket(AF_INET,SOCK_STREAM)
                    client.connect(addr)
                    client.send(''.join(list))
                    client.close()
                    del list[:] 
                except Exception, e:  
                    print str(e) 
                    time.sleep(int(sleep_time)/2)
                    continue                

        else:
            print '请设置地址和端口'
            break
        time.sleep(int(sleep_time))

以下为config_client.ini文件内容:
config_client.ini:

[global]
;其中*为必填项

;服务端IP地址 *
ip = xxx.xx.xx.xx

;服务端端口 *
port = 19999

;需要监控的进程名
process = tomcat,apache,xxxx,xxxx

;磁盘使用百分比(0-99)
disk_num = 80

;是否监控mysql数据库,是=1,否=0 *  
sql = 0

;是否监控ftp服务,是=1,否=0
ftp = 0

;设置监测间隔时间(秒) *
sleep = 1800

服务端上传Server.py、和config_server.ini,
之后使用nohup python -u Server.py即可,
客户端上传Client.py和config_client.ini,
使用nohup python -u Client.py命令。
使用tail -f nohup.out查看相关日志。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值