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实现的jpg格式图片修复代码
Apr 21 Python
python3 shelve模块的详解
Jul 08 Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 Python
python实现最长公共子序列
May 22 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
Python2与Python3的区别详解
Feb 09 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
python 实现Requests发送带cookies的请求
Feb 08 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
十天学会php(2)
2006/10/09 PHP
php仿ZOL分页类代码
2008/10/02 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
子页向父页传值示例
2013/11/27 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
python实现用户登录系统
2016/05/21 Python
Python中基础的socket编程实战攻略
2016/06/01 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
python让列表倒序输出的实例
2018/06/25 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
自荐信需注意事项
2014/01/25 职场文书
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
交通事故被告答辩状
2015/05/22 职场文书
升学宴家长致辞
2015/07/27 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
pytorch 6 batch_train 批训练操作
2021/05/28 Python
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫