最代码官方的gravatar头像
最代码官方 2017-05-28 23:15:26

python开发监控linux cpu高于指定值的脚本,并统计nginx日志访问记录最高的ip发送邮件

最代码经常被莫名的ip攻击到cpu超高导致服务异常,所以通过python实现了一个监控脚本,可以通过crontab每隔1分钟监控cpu的使用率,如果超过指定值70%则统计下nginx访问的最近10000条log中,最高访问记录的10个ip并且发邮件到指定邮箱。

# encoding=utf8

import re
import os
import commands

##定时监控cpu,超过80%则统计nginx访问log,将10000行内访问记录数最大的前10名ip和log记录发邮件

cpu_max = 70
zuidaima_nginx_log_path = "/usr/local/nginx/logs/www.zuidaima.com.access.log"
# cpu 1秒刷新采集5次
sar_cpu_shell = "sar -u 1 5|awk -F\" \" '{print $3}'"

tail_nginx_shell = "tail -n 10000 " + zuidaima_nginx_log_path+" |grep -v \"GET /user/reminds\"|grep -v \" 403 \""

pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')

mail_shell = "echo \"%s\" | mail -s \"$(echo -e \"%s\nContent-Type: text/html\")\" zuidaima@qq.com"


def parse_cpu():
    outputs = commands.getoutput(sar_cpu_shell)
    cpu_array = outputs.split("\n")
    ret = cpu_array[len(cpu_array) - 1]
    return float(ret)


def tail_date_nginx_log():
    ret = commands.getoutput(tail_nginx_shell)
    return ret


def parse_ip_view(logs):
    log_list = logs.split("\n")
    ret = {}
    ip_log_dic = {}
    for log in log_list:
        match = pattern.match(log)
        if match:
            ip = match.group(0)
            if ip in ip_log_dic:
                ip_view = ip_log_dic[ip]
            else:
                ip_view=[]
            ip_view.append(log)
            ip_log_dic[ip] = ip_view
    sorted_ip_log_dic = sorted(ip_log_dic.iteritems(), key=lambda ip_view: len(ip_view[1]), reverse=True)
    #print type(sorted_ip_log_dic)
    l = len(sorted_ip_log_dic)
    if len > 10:
        l = 10
    ret = sorted_ip_log_dic[0:l]
    return ret


def mail(content):
    content_str=""
    for log in content:
	log0=log[1][0].replace("\"","'")
	content_str=content_str+"&nbsp;&nbsp;"+log[0]+"&nbsp;&nbsp;"+str(len(log[1]))+"&nbsp;&nbsp;<div style='color:red'>"+log0+"</div><br/><br/>"
    #content_str = ''.join(content).replace("\"","'")
    mail_shell_str = (mail_shell % (content_str, "cpu monitor"))
#    print mail_shell_str
    commands.getoutput(mail_shell_str)


def main():
    cpu = parse_cpu()
    #print cpu,cpu<cpu_max
    if (cpu < cpu_max):
        return
    logs = tail_date_nginx_log()
    ip_views = parse_ip_view(logs)
    mail(ip_views)


main()

通过crontab定时1分钟调用

*/1 * * * * python /data/src/zuidaima_script/src/com/zuidaima/script/jarvis.py

运行截图

python开发监控linux cpu高于指定值的脚本,并统计nginx日志访问记录最高的ip发送邮件

最代码是阿里云服务器,自带的python版本是2.4.3,如果语法有兼容性问题,牛牛们可以根据情况做调整。enjoy it

喜欢钢铁侠的jarvis机器人,所以命名为jarvis.py,以后还会有更多类似的jarvis小机器人上线处理你想要的一些繁琐,重复,有规律的任务。


打赏

文件名:jarvis.rar,文件大小:1.081K 下载
  • /
    • /jarvis.py
最代码最近下载分享源代码列表最近下载
lifengxiang998  LV1 7月5日
马儿爱吃兰  LV10 2021年6月8日
blockC  LV10 2019年11月23日
mengnan8989  LV22 2019年4月21日
m719067455  LV20 2019年3月26日
摘星星的老鼠  LV8 2019年2月24日
hhhhhefd  LV17 2018年9月28日
jic499  LV27 2018年4月14日
byj1987  LV18 2018年1月18日
yvette5257  LV8 2017年8月30日
最代码最近浏览分享源代码列表最近浏览
笨小孩一号  LV22 8月2日
mwb  LV5 7月25日
Trickster  LV8 5月17日
youwuzuichen  LV8 5月13日
等你归来  LV2 3月6日
dfkk_love  LV10 1月2日
lewis365  LV2 2021年9月1日
马儿爱吃兰  LV10 2021年6月8日
amour1  LV11 2021年6月4日
与哲rhcy  LV5 2021年5月10日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友