实现celery中出现拥挤队列时,及时发邮件通知
里面有几个常用的功能,以后值得借鉴。
如获取脚本目录,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中出现拥挤队列时,及时发邮件通知的更多相关文章
- 删除MSMQ中的消息队列时"访问被拒绝的错误"
删除MSMQ中消息队列时出现 google之,发现也没有找到解决方法,自己在琢磨一下,一般出现这种问题的都是权限问题,因此查看了一下属性,果然如此 此消息队列是使用Windows服务创建的 解决办法: ...
- 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 ...
- iOS中打电话、打开网址、发邮件、发短信等
常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...
- RabbitMQ中声明交换器,队列时的,autoDelete=true自动删除的条件
在声明交换器和队列时,有一个属性叫autoDelete,表示是否自动删除. 如果autoDelete=true,表示自动删除.此处我们要理解,自动删除的条件是什么? 这里的关键是,自动删除的条件是向后 ...
- python celery 多work多队列
1.Celery模块调用 既然celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢,celery可以支持多台不通的计算机执行不同的任务或者相同的任务. 如果要说celery的分 ...
- celery中的生产者消费者问题
celery中的生产者消费者问题 在task1.py文件中: # demo1:task.py and celery.py in one file# run it byfrom celery impor ...
- 扫描QPS控制——celery任务分多队列运行
发包QPS控制,有两个难点. 1. redis交互流量的限制. 假设每分钟有1000条流量任务生成,每条跑20个插件,每个插件发5个数据包,每分钟约发十万请求. 那么在发包处做QPS会遇到一个问题,如 ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- STL中的单向队列queue
转载自:http://blog.csdn.net/morewindows/article/details/6950917 stl中的queue指单向队列,使用时,包含头文件<queue>. ...
随机推荐
- bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)
菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...
- Lipshitz
Portal --> broken qwq Description 大M正在学习函数的光滑性并对Lipschitz常数非常感兴趣:当一个定义域为\([l,r]\)的函数\(f\),对于定义域内的 ...
- Notes of fwt
昨天考试由于不会fwt而爆炸,所以今天搞了一下fwt……话说这玩意的普及程度已经很高了.fwt,快速沃尔什变换,可以用于位运算卷积的优化,是一种线性变换,所以就会有许多好的性质(eg:可以直接模,可以 ...
- Android MediaRecorder解析
源码路径:frameworks/base/media/java/android/media/MediaRecorder.javaframeworks/base/media/jni/android_me ...
- Azure 上SQL Database(PaaS)Time Zone时区问题处理
在Azure上面的PaaS时间都是以UTC时间为准(云的世界里基本上都是以UTC时间为标准的),所以以前在本地SQL Server上面常用的GetDate()方法会碰到问题,在中国获取的时间会被当前时 ...
- 前端PHP入门-031-文件上传-六脉神剑
php.ini的设置 php.ini的文件太多,找不到的时候你可以使用 Ctrl+F 搜索相关配置项. 配置项 功能说明 file_uploads on 为开启文件上传功能,off 为关闭 post_ ...
- 2015/9/29 Python基础(20):类的授权
类的授权 1.包装包装在Python编程世界中时经常会被提到的一个术语.它是一个通用的名字,意思是对一个已存在的对象进行包装,不管它是数据类型,还是一段代码,可以是对一个已存在的对象,增加新的,删除不 ...
- Why are Eight Bits Enough for Deep Neural Networks?
Why are Eight Bits Enough for Deep Neural Networks? Deep learning is a very weird technology. It evo ...
- (四)伪分布式下jdk1.6+Hadoop1.2.1+HBase0.94+Eclipse下运行wordCount例子
本篇先介绍HBase在伪分布式环境下的安装方式,然后将MapReduce编程和HBase结合起来使用,完成WordCount这个例子. HBase在伪分布环境下安装 一. 前提条件 已经成功地安装 ...
- Array和String测试与java.String.split
java.string.split() 存在于java.lang包中,返回值是一个数组. 作用是按指定字符或者正则去切割某个字符串,结果以字符串数组形式返回. 例 String [] toSort = ...