进程超时控制

在一些情况下,为了保证业务的正常执行,某些服务必须在指定的时间内执行,比如备份的服务等,可能只能在晚上执行,超过一定时间,就必须停止,不能影响正常业务。

# -*- coding: utf-8 -*-
import os
import time
import sys
import datetime
import traceback
import tempfile
import subprocess
import shlex
import logging

COMMAND_PID_ROOT_PATH = os.path.join(tempfile.gettempdir(),"command_pids")

def get_log(file_name):
    LOG_DIR = "/var/log/test/" #正式通讯服务端日志目录

    if os.name != "posix":
        LOG_DIR =  os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]

    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR)
        
    path = os.path.join(LOG_DIR,file_name)
    logger = logging.getLogger()
    hdlr = logging.FileHandler(path)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)
    logger.setLevel(logging.NOTSET)
    return logger

logger = get_log("guard_process.log")

TIMEOUT_COUNT = 5*60 #设置默认超时时间,单位秒

u"""
    调用方式:
    flock -xn  /tmp/test.lock  -c  'python /var/www/guard_process.py "python /var/www/test/test2.py ok" 1800'
"""

if __name__ == "__main__":
    args = shlex.split(sys.argv[1])
    if len(sys.argv) >=3: #超时时间也可以传递进来
        TIMEOUT_COUNT = int(sys.argv[2])
    
    child = subprocess.Popen(args)
    start_time = time.time()
    while True:
        is_end = child.poll()
        end_time = time.time()
        if is_end == 0: #子进程正常结束
            logger.info(
                "args='{args}' normal end pid='{pid}'".format(
                    args=args,
                    pid=child.pid,
                )
            )
            break
        elif (end_time - start_time)>TIMEOUT_COUNT: #超时
            logger.info(
                "args='{args}' timeout kill child pid='{pid}'".format(
                    args=args,
                    pid=child.pid,
                )
            )
            child.kill()
            break
        else:
            time.sleep(3)
            
    logger.info("args='{args}' ending".format(args = args))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值