里面有几个常用的功能,以后值得借鉴。

如获取脚本目录,IP,获取shell返回值,发送邮件等..

上午写完,中午测试,下午上线~~

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import smtplib
from email.mime.text import MIMEText
import socket
import fcntl
import struct
import sys
import os

#######################################
# 实现celery中出现拥挤队列时,及时发邮件通知 #
#             aguncn@163.com          #
#######################################

# 从系统命令中获取返回值
def run_cmd(cmd):
    try:
        import subprocess
    except ImportError:
        _, result_f, error_f = os.popen3(cmd)
    else:
        process = subprocess.Popen(cmd, shell = True,
        stdout = subprocess.PIPE, stderr = subprocess.PIPE)
        result_f, error_f = process.stdout, process.stderr  

    errors = error_f.read()
    if errors:
        pass
    result_str = result_f.read().strip()
    if result_f:
        result_f.close()
    if error_f:
        error_f.close()  

    return result_str

# 格式化命令,获取脚本绝对脚本,crontab也可执行
def format_cmd(cmd):
    filename = sys.argv[0]
    dirname = os.path.dirname(filename)
    abspath = os.path.abspath(dirname)
    return "python %s/manage_prd.py celery inspect %s -d celeryd@deploy" % (abspath, cmd)

# 获取指定网卡的IP
def get_ip(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])  

#发送邮件
class PM(object):
    def __init__(self, msg_str=None):
        self.msg_str = msg_str

    def send_email(self, email_list):
        mail_host = "x.x.x.x"
        sender_email = "a@b.c"
        subject = "celery alert"
        msg = MIMEText(self.msg_str.encode('utf8'), _subtype='plain', _charset='utf8')
        msg['From'] = sender_email
        msg['Subject'] = u'%s' % subject
        msg['To'] = ",".join(email_list)

        try:
            s = smtplib.SMTP(mail_host, 25)
            s.sendmail(sender_email, receivers_list, msg.as_string())
            s.close()
        except Exception as e:
            print 'Exception: ', e

if __name__ == '__main__':
    active_cmd_str = format_cmd("active")
    revoked_cmd_str = format_cmd("revoked")
    reserved_cmd_str = format_cmd("reserved")
    reserved_return_str = run_cmd(reserved_cmd_str)
    if "empty" not in reserved_return_str:
        receivers_list = ["a@b.c", "a@b.c"]
        ip = get_ip('eth0')
        email_str = "http://%s:8000/" %(ip)
        email_str = email_str + "\n" + "active: " + "\n"
        email_str = email_str + run_cmd(active_cmd_str) + "\n"
        email_str = email_str + "reserved: " + "\n"
        email_str = email_str + run_cmd(reserved_cmd_str) + "\n"
        email_str = email_str + "revoked: " + "\n"
        email_str = email_str + run_cmd(revoked_cmd_str) + "\n"
        email_inst = PM(email_str)
        email_inst.send_email(receivers_list)
        print "send a alert email."
    else:
        print "all ok, no email send."

实现celery中出现拥挤队列时,及时发邮件通知的更多相关文章

  1. 删除MSMQ中的消息队列时"访问被拒绝的错误"

    删除MSMQ中消息队列时出现 google之,发现也没有找到解决方法,自己在琢磨一下,一般出现这种问题的都是权限问题,因此查看了一下属性,果然如此 此消息队列是使用Windows服务创建的 解决办法: ...

  2. celery中配置redis密码时的ValueError: invalid literal for int() with base 10: 'xxxx'

    原配置: celery_broker = 'redis://:xxxx#xxxx@172.17.0.1:6379/0' # docker0 错误原因: 密码中不能有 # ? 等特殊字符 (无语O__O ...

  3. iOS中打电话、打开网址、发邮件、发短信等

    常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...

  4. RabbitMQ中声明交换器,队列时的,autoDelete=true自动删除的条件

    在声明交换器和队列时,有一个属性叫autoDelete,表示是否自动删除. 如果autoDelete=true,表示自动删除.此处我们要理解,自动删除的条件是什么? 这里的关键是,自动删除的条件是向后 ...

  5. python celery 多work多队列

    1.Celery模块调用 既然celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢,celery可以支持多台不通的计算机执行不同的任务或者相同的任务. 如果要说celery的分 ...

  6. celery中的生产者消费者问题

    celery中的生产者消费者问题 在task1.py文件中: # demo1:task.py and celery.py in one file# run it byfrom celery impor ...

  7. 扫描QPS控制——celery任务分多队列运行

    发包QPS控制,有两个难点. 1. redis交互流量的限制. 假设每分钟有1000条流量任务生成,每条跑20个插件,每个插件发5个数据包,每分钟约发十万请求. 那么在发包处做QPS会遇到一个问题,如 ...

  8. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  9. STL中的单向队列queue

    转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...

随机推荐

  1. bzoj2734:[HNOI2012]集合选数(状压DP)

    菜菜的喵喵题~ 化序列为矩阵!化腐朽为神奇!左上角为1,往右每次*3,往下每次*2,这样子就把问题转化成了在矩阵里选不相邻的数有几种可能. 举个矩阵的例子 1 3 9 27 2 6 18 54 4 1 ...

  2. 解题:BOI 2008 Elect

    题面 做背包时可以通过排序来使得转移满足某种限制或是让我们判断一个状态是否有贡献 这个题将人数从大到小排序后做背包,这样每次那个最小的党加入而使得答案合法时之前的党也都是合法的 #include< ...

  3. 【题解】期末考试 六省联考 2017 洛谷 P3745 BZOJ 4868 贪心 三分

    题目传送门:这里是萌萌哒传送门(>,<) 啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法. 思路很简单,假设我指定了一个x, ...

  4. python--文件操作删除某行

    使用continue跳过本次写循环就可以了 #文本内容 Yesterday when I was young 昨日当我年少轻狂 The tasting of life was sweet 生命的滋味是 ...

  5. win32/linux 线程 log

    原文 #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32 #includ ...

  6. GridControl详解(十)BandedGridView

    转换结果: 运行结果呈现:

  7. bzoj 3123 可持久化线段树启发式合并

    首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...

  8. python作业员工信息表程序(第四周)

    作业需求: 1. 员工信息表程序,实现增删改查操作: 2. 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 ...

  9. hdu 2063 过山车 二分匹配(匈牙利算法)

    简单题hdu2063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Ot ...

  10. BAT-快速切换JDK1.6/1.7

    Code: @echo OFF rem 修改背景/字体颜色为黑/绿 color 0A rem 自动设置JDK环境变量,本程序不会对 [系统环境变量] 造成破环!不需要重启!! rem 没有%%JAVA ...