Python写的服务监控程序实例


Posted in Python onJanuary 31, 2015

前言:

Redhat下安装Python2.7

rhel6.4自带的是2.6, 发现有的机器是python2.4。 到python网站下载源代码,解压到Redhat上,然后运行下面的命令:

# ./configure --prefix=/usr/local/python27

# make

# make install

这样安装之后默认不会启用Python2.7,需要使用/usr/local/python27/bin/python2.7调用新版本的python。

而下面的安装方式会直接接管现有的python

# ./configure

# make

# make install

开始:

服务子进程被监控主进程创建并监控,当子进程异常关闭,主进程可以再次启动之。使用了python的subprocess模块。就这个简单的代码,居然互联网上没有现成可用的例子。没办法,我写好了贡献出来吧。

首先是主进程代码:service_mgr.py

#!/usr/bin/python  

#-*- coding: UTF-8 -*-  

# cheungmine  

# stdin、stdout和stderr分别表示子程序的标准输入、标准输出和标准错误。  

#   

# 可选的值有:  

#   subprocess.PIPE - 表示需要创建一个新的管道.  

#   一个有效的文件描述符(其实是个正整数)  

#   一个文件对象  

#   None - 不会做任何重定向工作,子进程的文件描述符会继承父进程的.  

#   

# stderr的值还可以是STDOUT, 表示子进程的标准错误也输出到标准输出.  

#   

# subprocess.PIPE  

# 一个可以被用于Popen的stdin、stdout和stderr 3个参数的特输值,表示需要创建一个新的管道.  

#   

# subprocess.STDOUT  

# 一个可以被用于Popen的stderr参数的特输值,表示子程序的标准错误汇合到标准输出.  

################################################################################  

import os  

import sys  

import getopt  

  

import time  

import datetime  

  

import codecs  

  

import optparse  

import ConfigParser  

  

import signal  

import subprocess  

import select  

  

# logging  

# require python2.6.6 and later  

import logging    

from logging.handlers import RotatingFileHandler  

  

## log settings: SHOULD BE CONFIGURED BY config  

LOG_PATH_FILE = "./my_service_mgr.log"  

LOG_MODE = 'a'  

LOG_MAX_SIZE = 4*1024*1024 # 4M per file  

LOG_MAX_FILES = 4          # 4 Files: my_service_mgr.log.1, printmy_service_mgrlog.2, ...    

LOG_LEVEL = logging.DEBUG    

  

LOG_FORMAT = "%(asctime)s %(levelname)-10s[%(filename)s:%(lineno)d(%(funcName)s)] %(message)s"    

  

handler = RotatingFileHandler(LOG_PATH_FILE, LOG_MODE, LOG_MAX_SIZE, LOG_MAX_FILES)  

formatter = logging.Formatter(LOG_FORMAT)  

handler.setFormatter(formatter)  

  

Logger = logging.getLogger()  

Logger.setLevel(LOG_LEVEL)  

Logger.addHandler(handler)   

  

# color output  

#  

pid = os.getpid()   

  

def print_error(s):  

    print '\033[31m[%d: ERROR] %s\033[31;m' % (pid, s)  

  

def print_info(s):  

    print '\033[32m[%d: INFO] %s\033[32;m' % (pid, s)  

  

def print_warning(s):  

    print '\033[33m[%d: WARNING] %s\033[33;m' % (pid, s)  

  

  

def start_child_proc(command, merged):  

    try:  

        if command is None:  

            raise OSError, "Invalid command"  

  

        child = None  

  

        if merged is True:  

            # merge stdout and stderr  

            child = subprocess.Popen(command,  

                stderr=subprocess.STDOUT, # 表示子进程的标准错误也输出到标准输出  

                stdout=subprocess.PIPE    # 表示需要创建一个新的管道  

            )  

        else:  

            # DO NOT merge stdout and stderr  

            child = subprocess.Popen(command,  

                stderr=subprocess.PIPE,  

                stdout=subprocess.PIPE)  

  

        return child  

  

    except subprocess.CalledProcessError:  

        pass # handle errors in the called executable  

    except OSError:  

        pass # executable not found  

  

    raise OSError, "Failed to run command!"  

  

  

def run_forever(command):  

    print_info("start child process with command: " + ' '.join(command))  

    Logger.info("start child process with command: " + ' '.join(command))  

  

    merged = False  

    child = start_child_proc(command, merged)  

  

    line = ''  

    errln = ''  

  

    failover = 0  

  

    while True:  

        while child.poll() != None:  

            failover = failover + 1  

            print_warning("child process shutdown with return code: " + str(child.returncode))             

            Logger.critical("child process shutdown with return code: " + str(child.returncode))  

  

            print_warning("restart child process again, times=%d" % failover)  

            Logger.info("restart child process again, times=%d" % failover)  

            child = start_child_proc(command, merged)  

  

        # read child process stdout and log it  

        ch = child.stdout.read(1)  

        if ch != '' and ch != '\n':  

            line += ch  

        if ch == '\n':  

            print_info(line)  

            line = ''  

  

        if merged is not True:  

            # read child process stderr and log it  

            ch = child.stderr.read(1)  

            if ch != '' and ch != '\n':  

                errln += ch  

            if ch == '\n':  

                Logger.info(errln)  

                print_error(errln)  

                errln = ''  

  

    Logger.exception("!!!should never run to this!!!")    

  

  

if __name__ == "__main__":  

    run_forever(["python", "./testpipe.py"]) 

然后是子进程代码:testpipe.py

#!/usr/bin/python  

#-*- coding: UTF-8 -*-  

# cheungmine  

# 模拟一个woker进程,10秒挂掉  

import os  

import sys  

  

import time  

import random  

  

cnt = 10  

  

while cnt >= 0:  

    time.sleep(0.5)  

    sys.stdout.write("OUT: %s\n" % str(random.randint(1, 100000)))  

    sys.stdout.flush()  

  

    time.sleep(0.5)  

    sys.stderr.write("ERR: %s\n" % str(random.randint(1, 100000)))  

    sys.stderr.flush()  

  

    #print str(cnt)  

    #sys.stdout.flush()  

    cnt = cnt - 1  

  

sys.exit(-1) 

Linux上运行很简单:

$ python service_mgr.py

Windows上以后台进程运行:
> start pythonw service_mgr.py

代码中需要修改:
run_forever(["python", "testpipe.py"]) 
Python 相关文章推荐
Python argv用法详解
Jan 08 Python
python队列queue模块详解
Apr 27 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
Python实现正则表达式匹配任意的邮箱方法
Dec 20 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
使用python去除图片白色像素的实例
Dec 12 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
用python 制作图片转pdf工具
Jan 30 #Python
Python是编译运行的验证方法
Jan 30 #Python
Python的类实例属性访问规则探讨
Jan 30 #Python
Python中的作用域规则详解
Jan 30 #Python
Python中使用Boolean操作符做真值测试实例
Jan 30 #Python
Python中的zip函数使用示例
Jan 29 #Python
Python的另外几种语言实现
Jan 29 #Python
You might like
星际原理概述
2020/03/04 星际争霸
Syphon 秘笈
2021/03/03 冲泡冲煮
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
JavaScript获取当前日期是星期几的方法
2015/04/06 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
python中reader的next用法
2018/07/24 Python
jupyter 导入csv文件方式
2020/04/21 Python
如何利用Python 进行边缘检测
2020/10/14 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
剪彩仪式主持词
2014/03/19 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
社区端午节活动总结
2015/02/11 职场文书
学校重阳节活动总结
2015/03/24 职场文书
医院感染管理制度
2015/08/05 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python