Python2.7实现监控Linux内存、CPU并发送预警邮件
来源:互联网 发布:北京文思海辉金信软件 编辑:程序博客网 时间:2024/05/22 08:25
#!/usr/bin/env python# coding=utf-8import osimport schedimport smtplibimport sysimport timefrom email.header import Headerfrom email.mime.text import MIMETextimport psutilfrom Daemon import DaemonMEM_WARN_LINE = 85CPU_WARN_LINE = 90SCHED_TIME = 60*60*6 # 单位,秒def sendmail(content): subject = '[Python服务器监控]%s服务器监控预警' % '192.168.8.122' username = 'username' password = 'password' smtp_server = 'smtp.126.com' header = '您好!<br/> %s服务器性能预警<br/>' % '192.168.8.122' footer = '--------------------------------------------------------<br/>此为系统邮件请勿回复' content = '%s<br/>%s<br/>%s' % (header, content, footer) msg = MIMEText(content, 'html', 'utf-8') # 中文需参数‘utf-8',单字节字符不需要 msg['Subject'] = Header(subject, 'utf-8') msg['From'] = "%s<username@126.com>" % Header('Python监控预警','utf-8') msg['to'] = 'username@163.com' # 单独收信人 msg_to_list = ["user1@qq.com", "user2@qq.com"] # 多个收信人 smtp = smtplib.SMTP() smtp.connect(smtp_server) smtp.login(username, password) smtp.sendmail(msg['From'], msg_to_list, msg.as_string()) smtp.quit()def is_mem_warning(): mem = psutil.virtual_memory() if mem.percent > MEM_WARN_LINE: return [True, mem] else: return [False]def is_cpu_warning(): cpupercent = psutil.cpu_percent() if cpupercent > CPU_WARN_LINE: return [True, cpupercent] else: return [False]def check_status(): memwarn = is_mem_warning() is_send_mail = False if memwarn[0]: mem = memwarn[1] title = "内存预警[时间:%s]" % time.ctime() memmsg = str("%s\n 占用率:%s%%\n 总数:%s\n 已使用:%s\n 空闲:%s\n" % (title, mem.percent, mem.total, mem.used, mem.free)) is_send_mail = True else: memmsg = '' cpuwarn = is_cpu_warning() if cpuwarn[0]: title = "CPU预警[时间:%s]" % time.ctime() cpumsg = str("%s\n 使用率 %s%%\n" % (title, cpuwarn[1])) is_send_mail = True else: cpumsg = '' if is_send_mail: sendmail("%s\n%s" % (memmsg, cpumsg)) sys.stderr.write("[error]{%s} 监测异常\n %s\n%s" % (time.ctime(), memmsg, cpumsg)) sys.stderr.flush() else: sys.stderr.write("[info]{%s} 监测无异常\n" % time.ctime()) sys.stderr.flush() schedule.enter(SCHED_TIME, 0, check_status, ())class MyTestDaemon(Daemon): def run(self): sys.stdout.write('[info]{%s} Daemon started with pid {%s}\n' % (time.ctime(), os.getpid())) sys.stdout.flush() # while True: schedule.enter(SCHED_TIME, 0, check_status, ()) schedule.run()if __name__ == '__main__': schedule = sched.scheduler(time.time, time.sleep) PIDFILE = '/tmp/daemon-sysinfo.pid' LOG = '/tmp/daemon-sysinfo.log' daemon = MyTestDaemon(pidfile=PIDFILE, stdout=LOG, stderr=LOG) if len(sys.argv) != 2: print('Usage: {} [start|stop]'.format(sys.argv[0])) raise SystemExit(1) if 'start' == sys.argv[1]: daemon.start() elif 'stop' == sys.argv[1]: daemon.stop() elif 'restart' == sys.argv[1]: daemon.restart() else: print('Unknown command {!r}'.format(sys.argv[1])) raise SystemExit(1)
#!/usr/bin/env pythonimport atexitimport osimport sysimport timefrom signal import SIGTERMclass Daemon: """ A generic daemon class. Usage: subclass the Daemon class and override the run() method """ def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): self.stdin = stdin self.stdout = stdout self.stderr = stderr self.pidfile = pidfile def daemonize(self): """ do the UNIX double-fork magic, see Stevens' "Advanced Programming in the UNIX Environment" for details (ISBN 0201563177) http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 """ try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) # decouple from parent environment os.chdir("/") os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent sys.exit(0) except OSError, e: sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) sys.exit(1) # redirect standard file descriptors sys.stdout.flush() sys.stderr.flush() si = file(self.stdin, 'r') so = file(self.stdout, 'a+') se = file(self.stderr, 'a+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) # write pidfile atexit.register(self.delpid) pid = str(os.getpid()) file(self.pidfile, 'w+').write("%s\n" % pid) def delpid(self): os.remove(self.pidfile) def start(self): """ Start the daemon """ # Check for a pidfile to see if the daemon already runs try: pf = file(self.pidfile, 'r') pid = int(pf.read().strip()) pf.close() except IOError: pid = None if pid: message = "pidfile %s already exist. Daemon already running?\n" sys.stderr.write(message % self.pidfile) sys.exit(1) # Start the daemon self.daemonize() self.run() def stop(self): """ Stop the daemon """ # Get the pid from the pidfile try: pf = file(self.pidfile, 'r') pid = int(pf.read().strip()) pf.close() except IOError: pid = None if not pid: message = "pidfile %s does not exist. Daemon not running?\n" sys.stderr.write(message % self.pidfile) return # not an error in a restart # Try killing the daemon process try: while 1: os.kill(pid, SIGTERM) time.sleep(0.1) except OSError, err: err = str(err) if err.find("No such process") > 0: if os.path.exists(self.pidfile): os.remove(self.pidfile) else: print str(err) sys.exit(1) def restart(self): """ Restart the daemon """ self.stop() self.start() def run(self): """ You should override this method when you subclass Daemon. It will be called after the process has been daemonized by start() or restart(). """
参考资料:
http://www.jianshu.com/p/e3f3d49093ca
http://blog.csdn.net/zm2714/article/details/8134118
阅读全文
0 0
- Python2.7实现监控Linux内存、CPU并发送预警邮件
- python2.7发送邮件
- 树莓派获取Nodemcu温度并发送邮件预警
- python实现自动监控网站并发送邮件告警
- linux perl——发送邮件及监控内存
- python监控脚本,监控CPU,磁盘报警时发送邮件
- linux ping命令实现网络监控 并邮件提醒管理员
- psutil监控CPU内存磁盘并告警
- 利用python监控linux系统cpu、内存、文件系统的使用情况以及简单的邮件报警
- oracle监控自动发邮件预警
- 监控服务器端口,Down掉会自动重启,并发送邮件 Linux Shell
- 采购订单邮件发送预警设置
- 使用Quartz框架定时发送预警邮件
- Linux下监控内存与CPU占用并保存到文件
- 监控Linux系统的内存和CPU,并使用excel表格绘制曲线
- grafana+influxdb+python实现监控cpu、内存
- Linux CPU、内存监控命令详解
- Linux--shell监控CPU和内存
- Android 数据库基础 01
- 复习一:java基础知识点
- 线程经典模式之---生产者和消费者
- spring的IOC详解
- ubuntu常用工具记录
- Python2.7实现监控Linux内存、CPU并发送预警邮件
- leetcode: 93. Restore IP Addresses
- LINUX-LINUX下简易彩色进度条实现
- MapReduce 自定义输入输出(很有用)
- Python 函数式编程未完结
- 唯快不破:TCP/IP详解--TIME_WAIT状态的必要性
- leetcode: 94. Binary Tree Inorder Traversal
- 软件调试技巧(一)
- Kafka集群搭建详细步骤