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的PEAK来适配协议的教程
Apr 14 Python
Python基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
Dec 15 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Python迭代器定义与简单用法分析
Apr 30 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
使用python模拟命令行终端的示例
Aug 13 Python
python实现登录密码重置简易操作代码
Aug 14 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
2015/10/10 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
Python 3中的yield from语法详解
2017/01/18 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
django使用JWT保存用户登录信息
2020/04/22 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
我的求职计划书
2014/01/10 职场文书
报到证丢失证明
2014/01/11 职场文书
大学新闻系求职信
2014/06/03 职场文书
阿凡达观后感
2015/06/10 职场文书
职工培训工作总结
2015/08/10 职场文书
优秀学生主要事迹怎么写
2015/11/04 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers
python playwright之元素定位示例详解
2022/07/23 Python