简单的进程监控脚本
现有多台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查看相关日志。