最代码官方的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
最代码最近下载分享源代码列表最近下载
qiheideguang  LV16 2023年3月29日
lifengxiang998  LV1 2022年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日
最代码最近浏览分享源代码列表最近浏览
爽朗的凯  LV2 2023年11月20日
wangjie49  LV7 2023年11月3日
123456dian  LV6 2023年10月21日
三几个  LV11 2023年8月8日
flyjoe  LV3 2023年7月11日
阿金斯顾客1 2023年6月30日
暂无贡献等级
妖刀飞姬杯  LV2 2023年6月11日
2292250314  LV2 2023年5月28日
lichun cai  LV1 2023年5月24日
zhb1991 2023年4月27日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友