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

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

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

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3.  
  4. import smtplib
  5. from email.mime.text import MIMEText
  6. import socket
  7. import fcntl
  8. import struct
  9. import sys
  10. import os
  11.  
  12. #######################################
  13. # 实现celery中出现拥挤队列时,及时发邮件通知 #
  14. # aguncn@163.com #
  15. #######################################
  16.  
  17. # 从系统命令中获取返回值
  18. def run_cmd(cmd):
  19. try:
  20. import subprocess
  21. except ImportError:
  22. _, result_f, error_f = os.popen3(cmd)
  23. else:
  24. process = subprocess.Popen(cmd, shell = True,
  25. stdout = subprocess.PIPE, stderr = subprocess.PIPE)
  26. result_f, error_f = process.stdout, process.stderr
  27.  
  28. errors = error_f.read()
  29. if errors:
  30. pass
  31. result_str = result_f.read().strip()
  32. if result_f:
  33. result_f.close()
  34. if error_f:
  35. error_f.close()
  36.  
  37. return result_str
  38.  
  39. # 格式化命令,获取脚本绝对脚本,crontab也可执行
  40. def format_cmd(cmd):
  41. filename = sys.argv[0]
  42. dirname = os.path.dirname(filename)
  43. abspath = os.path.abspath(dirname)
  44. return "python %s/manage_prd.py celery inspect %s -d celeryd@deploy" % (abspath, cmd)
  45.  
  46. # 获取指定网卡的IP
  47. def get_ip(ifname):
  48. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  49. return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])
  50.  
  51. #发送邮件
  52. class PM(object):
  53. def __init__(self, msg_str=None):
  54. self.msg_str = msg_str
  55.  
  56. def send_email(self, email_list):
  57. mail_host = "x.x.x.x"
  58. sender_email = "a@b.c"
  59. subject = "celery alert"
  60. msg = MIMEText(self.msg_str.encode('utf8'), _subtype='plain', _charset='utf8')
  61. msg['From'] = sender_email
  62. msg['Subject'] = u'%s' % subject
  63. msg['To'] = ",".join(email_list)
  64.  
  65. try:
  66. s = smtplib.SMTP(mail_host, 25)
  67. s.sendmail(sender_email, receivers_list, msg.as_string())
  68. s.close()
  69. except Exception as e:
  70. print 'Exception: ', e
  71.  
  72. if __name__ == '__main__':
  73. active_cmd_str = format_cmd("active")
  74. revoked_cmd_str = format_cmd("revoked")
  75. reserved_cmd_str = format_cmd("reserved")
  76. reserved_return_str = run_cmd(reserved_cmd_str)
  77. if "empty" not in reserved_return_str:
  78. receivers_list = ["a@b.c", "a@b.c"]
  79. ip = get_ip('eth0')
  80. email_str = "http://%s:8000/" %(ip)
  81. email_str = email_str + "\n" + "active: " + "\n"
  82. email_str = email_str + run_cmd(active_cmd_str) + "\n"
  83. email_str = email_str + "reserved: " + "\n"
  84. email_str = email_str + run_cmd(reserved_cmd_str) + "\n"
  85. email_str = email_str + "revoked: " + "\n"
  86. email_str = email_str + run_cmd(revoked_cmd_str) + "\n"
  87. email_inst = PM(email_str)
  88. email_inst.send_email(receivers_list)
  89. print "send a alert email."
  90. else:
  91. 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. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  2. [CTSC2007]动物园zoo

    link 试题分析 发现每个小朋友最多只能看到$5$个动物所以考虑状压$dp$.我们定义$f(i,j)$为第$i$个位置从此往后$5$个人的最喜欢数量.所以只要预处理出对于每个点从后$5$个会让多少小 ...

  3. OpenCV(C++版)图像读取,创建,复制,保存,显示

    http://blog.163.com/yuyang_tech/blog/static/21605008320132642254689/ 一个小例子: #include "stdafx.h& ...

  4. shell函数使用

    函数定义格式: 和js有点类似,不过在 shell 中 function 关键字是可选的. 如: sum { // shell 语句 } function sum() { // shell 语句 } ...

  5. STL源码分析-function

    http://note.youdao.com/noteshare?id=269e16541b43095eaf97636d4e046b1d

  6. Qt ------ QTabWidget

    下图: 1.长方形的 objectName 可写可不写,不写就作用于所有 QTabWidget:椭圆形的 QTabWidget#tabWidget 要么四个都要写,要么四个都不写 2.下图的 CSS ...

  7. K8s仪表盘

    { "__inputs": [ { "name": "DS_TEST-ENVIORMENT-K8S", "label": ...

  8. SpringBoot (四) :thymeleaf 使用详解

    原文出处: 纯洁的微笑 在上篇文章< springboot(二):web综合开发 >中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用.thymele ...

  9. 第5章-Vue.js交互及生命周期练习

    一.学习目标 使用网络请求进行前后端交互 (重点) 理解钩子函数的作用  (难点) 掌握Vue.js过滤器的使用方法 了解Vue.js事件的深入用法  (重点) 二.仿写留言板 2.1.实现" ...

  10. package.json文档

    之前在博客中写过一篇关于 " node.js的安装配置 " 的文章,里面有提到利用 gulp watch 来监听文档的变化.其中需要 package.json 文件才能实现效果,所 ...