最近写了一个web测试程序,因为部署在其他地方,所以想弄个监控的进程去看服务是不是还在,要是不在好发邮件,就用python简单的写了一个。

想法是这样的,单独运行一个monitor的脚本,每隔一段时间去访问web服务,如果无法链接,就说明服务挂了,要发邮件通知下,如果恢复了,那就发邮件提醒已经恢复。

当然,有的时候也要考虑到监控进程本身就挂了,或者不想监控了。

首先监控脚本是这样,很简单:

monitor.py

#-*-coding
'''
简单的monitor函数,主要监控一个远程服务是否还在
system 是一个系统model
'''
import time
import sys def monitor(system):
last_monitor_status=True
TimeInterval=10
while True:
is_active=check_system_status(system.env.env_ip,system.env.env_port,\
system.env.get_env_path())
if is_active==False and last_monitor_status==True:
'''
system is down,do something
'''
pass elif is_active==True and last_monitor_status==False:
'''
system revover
'''
pass
else:
pass
last_monitor_status=is_active
time.sleep(TimeInterval) if __name__=="__main__":
system=sys.argv[1]
monitor(system)

然后是监控的一些操作

control.py

#-*-coding:utf-8
import subprocess
import os def startMonitor(system):
'''
通过subprocess去启动监控
'''
monitorprocess=subprocess.Popen(["python","monitor.py","{0}".format(system)],\
shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) output,error=monitorprocess.communicate(input=None)
if error:
raise RuntimeError,error
pid=monitorprocess.pid
return True def stopMonitor(pid):
kill_result={0:"success",256:"no such process"}
kill_status=os.system("kill -9 {0}".format(pid))
return kill_result[kill_status] def checkMonitorProcess(pid):
systemcmd="ps -ef|grep -v '<defunct>'|awk '{print $2}'|grep {0}".\
format(pid)
monitorstatus=os.system(systemcmd)
return monitorstatus

用的话还是可以用的,服务发生异常都会发送邮件,在实际运行中遇到过这样的问题

1.通过subprocess去启动monitor脚本的时候,本来想通过comunicate()方法获取output和error,如果启动失败,抛出异常,确实当error有值的时候,会抛出异常,但是当

error没有的时候,本来应该正常启动监控,但是实际上通过浏览器启动的时候,本来启动成功了,浏览器也加载完成,但是浏览器的http请求好像一直连着,当去掉communicate()方法后

又可以立即启动,并且浏览器http加载完成,这个问题很苦恼,难道是因为我monitor脚本是一直循环运行的原因吗?但是我monitor是单独启动一个进程去执行的,应该没什么关系么

2.就是当我中止监控进程,想要检查进程还在的时候,因为我是用kill -9 pid去杀进程,然后判断进程号是不是还在,但是实际上当你立刻杀死进程的时候,还会有一个<defunct>的死进程在,要过会才会被回收,所以通过grep去判断的时候,要过滤掉这个。

ps:我猜这个进程应该是类似孤儿进程之类的吧,父进程被杀了,变孤儿了,然后过会由init回收了。僵尸进程好像是子进程完成任务了,然后发送消息给父进程,但是父进程没搭理,本来父进程退出以后,子进程也就退出了,但是偏偏父进程是一个一直运行的进程,就导致了子进程没事做,但又没被回收,就变成了僵尸进程,可以看出僵尸进程不干活了,但是过多的话还是会占用资源,想要避免僵尸进程的一个办法就是把僵尸变成孤儿,要init去回收。

python-监控服务的更多相关文章

  1. Python 监控nginx服务是否正常

    Python 监控nginx服务是否正常 #!/usr/bin/env python import os, sys, time from time import strftime while True ...

  2. 写一个python的服务监控程序

    写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...

  3. supervisord监控服务必备命令

    supervisord(http://supervisord.org/introduction.html)是一个非常优秀的进程管理工具,使用Python开发.它可以在类UNIX系统的方式让用户来准确地 ...

  4. python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动

    用python监控您的window服务 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.co ...

  5. http服务需要pycurl模块这样去监控服务

    最近运维还是比较空闲,写篇自己的心得体会.做过运维的应该都做过http服务了.像一些电子商城,或者是一些互联网公司,web的服务之类是至关重要的,近期看了刘天斯大哥的书觉得自己运维平台应该也可以这样去 ...

  6. python 微服务开发书中几个方便的python框架

    python 微服务开发是一本讲python 如果进行微服务开发的实战类书籍,里面包含了几个很不错的python 模块,记录下,方便后期回顾学习 处理并发的模块 greenlet && ...

  7. 使用 Consul 作为 Python 微服务的配置中心

    使用 Consul 作为 Python 微服务的配置中心 Consul 作为数据中心,提供了 k/v 存储的功能,我们可以利用这个功能为 Python 微服务提供配置中心. Consul 提供了 HT ...

  8. Python监控网站接口值

    Python监控网站接口值: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'liudong' import urllib,sy ...

  9. 使用 Dalvik 调试监控服务 (DDMS) 工具

    Android 附带一个叫Dalvik 调试监控服务 (DDMS) 的调试工具,它提供端口转发服务.在设备上的屏幕捕获,设备上的线程和堆栈信息, logcat,进程, 和无线状态信息,接收呼叫和SMS ...

  10. Python队列服务 Python RQ Functions from the __main__ module cannot be processed by workers.

    在使用Python队列服务 Python RQ 时候的报错: Functions from the __main__ module cannot be processed by workers. 原因 ...

随机推荐

  1. 【Cocos2d-x Lua】数据库封装类型的操作

    Lua数据库封装类型的操作 使用演示样例 lua代码: require("DB") -- 保存一个字符串(数据库中存储的数据都是以字符串的形式保存的) DB:getInstance ...

  2. java 保存和读取本地json文件

    保存数据到本地文件 private void saveDataToFile(String fileName,String data) { BufferedWriter writer = null; F ...

  3. Project Euler:Problem 39 Integer right triangles

    If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exact ...

  4. PCI GXL学习之安装篇

    作者:朱金灿 来源:http://blog.csdn.net/clever101 上周简单学习了PCI gxl的使用和二次开发.说实话gxl没有我想象中那么自动化,我原以为把一个数据处理作业扔给gxl ...

  5. 数据结构:点之间的最短距离--Floyd算法

    Floyd算法 Floyd算法 Dijkstra算法是用于解决单源最短路径问题的,Floyd算法则是解决点对之间最短路径问题的.Floyd算法的设计策略是动态规划,而Dijkstra採取的是贪心策略. ...

  6. jQuery立即调用表达式

    http://www.imooc.com/code/3247 立即调用表达式 任何库与框架设计的第一个要点就是解决命名空间与变量污染的问题.jQuery就是利用了JavaScript函数作用域的特性, ...

  7. Android系统联系人全特效实现(下),字母表快速滚动

    在上一篇文章中,我和大家一起实现了类似于Android系统联系人的分组导航和挤压动画功能,不过既然文章名叫做<Android系统联系人全特效实现>,那么没有快速滚动功能显然是称不上&quo ...

  8. WPF之动画

    原文:WPF之动画 线性关键帧.不连续关键帧动画: <Window.Triggers> <EventTrigger RoutedEvent="Window.Loaded&q ...

  9. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

  10. ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 设置和初始化数据库 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 设置和初始化数据库 上一章节中我们已经设置和配置好了 EF ...