最近写了一个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. C# opcode 查询源码

    Add|将两个值相加并将结果推送到计算堆栈上.Add.Ovf|将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上.Add.Ovf.Un|将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算 ...

  2. 如何使用Delphi设计强大的服务器程序

    现在网络的流行,使得服务器程序得到了广泛的应用,那么我们使用Delphi如何设计出强壮的服务器呢? 有人说,如果要设计服务器的话,一定要使用VC来设计,其实这个人说的有一定道理,因为如果你要使用Del ...

  3. css3中的制作动画小总结

    系列教程 CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation: Transform 在CSS3中transform主要包括以下几种:旋转rotate. ...

  4. WPF依赖属性(续)(3)依赖属性存储

    原文:WPF依赖属性(续)(3)依赖属性存储          在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...

  5. node lesson6

    https://nodejs.org/docs/latest/api/process.html#process_process_argv https://github.com/alsotang/nod ...

  6. Atitit.Gui控制and面板----db数据库领域----- .比较数据库同步工具 vOa

    Atitit.Gui控制and面板----db数据库区----- .数据库比較同步工具 vOa 1. 咨微海信数据库应用 工具 1 2. 数据库比較工具 StarInix SQL Compare    ...

  7. 使用c++代替使用的c包!

    看到很多人写c代码.的结构为包的各种元件.例如,使用转载如下epoll样本: //    // a simple echo server using epoll in linux   //    // ...

  8. moost — Last.fm's collection of C++ utility libraries(功能很多)

    libmoost libmoost is a collection of C++ utility libraries, including: algorithms (set intersection, ...

  9. python 教程 第十章、 输入/输出

    第十章. 输入/输出 1)    文件 poem = '''Programming is fun use Python!''' f = file('poem.txt', 'w') # open for ...

  10. Android正在使用Handler实现消息分发机制(零)

    演讲前,AsyncTask文章.我们在最后谈到.AsyncTask它是利用Handler异步消息处理机制,操作结果.使用Message回到主线程,从而执行UI更新线程. 而在我们的日常开发工作,Han ...