最代码官方的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\")\" [email protected]"


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
最代码最近下载分享源代码列表最近下载
blockC LV102019年11月23日
月亮月亮星星星星
mengnan8989 LV222019年4月21日
太阳月亮星星星星
m719067455 LV202019年3月26日
太阳月亮
摘星星的老鼠 LV82019年2月24日
月亮月亮
hhhhhefd LV142018年9月28日
月亮月亮月亮星星星星
jic499 LV272018年4月14日
太阳月亮月亮星星星星星星
byj1987 LV182018年1月18日
太阳星星星星
yvette5257 LV82017年8月30日
月亮月亮
huangwei LV82017年6月19日
月亮月亮
rocky1024 LV62017年6月6日
月亮星星星星
最代码最近浏览分享源代码列表最近浏览
SoulDream LV510月14日
月亮星星
tsd97677 LV710月9日
月亮星星星星星星
oo3534 LV29月30日
星星星星
fendashushu7月27日
暂无贡献等级
地方wdds LV27月17日
星星星星
Yaofilter LV16月25日
星星
flysky LV46月14日
月亮
812795769 LV155月24日
月亮月亮月亮星星星星星星
疯狂的爱人 LV115月20日
月亮月亮星星星星星星
hunan27 LV115月9日
月亮月亮星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友