文档章节

python popen.stdout.read阻塞 解决办法

f
 fang_faye
发布于 2018/12/10 10:29
字数 439
阅读 36
收藏 1

需求:利用python的subprocess模块结合logging模块实现监控子程序运行情况

代码如下(程序阻塞在stdout.readz这里,日志里找不到hang on...................):

import os
import sys
import time
import subprocess
import logging
from logging.handlers import RotatingFileHandler

todaylog = time.strftime('%Y-%m-%d', time.localtime(time.time())).decode('utf-8')
LOG_PATH_FILE = "C:\my.log"
LOG_MODE = 'a'
LOG_MAX_SIZE = 10 * 1024 * 1024  # 10M per file
LOG_MAX_FILES = 10  # 10 Files: my.1, my.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)

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):
    try:
        if command is None:
            raise OSError, "Invalid command"
        
        #Logger.info("def start_child_proc(command, merged):")
        child = None
        child = subprocess.Popen(command, stdout=subprocess.PIPE)
        return child
    except subprocess.CalledProcessError:
        pass  # handle errors in the called executable
    except OSError:
        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))

    child = start_child_proc(command)
    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))

            Logger.info('------------------------------------------')
            #print_warning("restart child process again, times=%d" % failover)
            Logger.info("restart child process again, times=%d" % failover)
            child = start_child_proc(command)
        # read child process stdout and log it
        ch = child.stdout.read()
        print "hang on..................."
        Logger.info("hang on...................")
        if ch != '':
            chlist = ch.split('\n')
        for chline in chlist:
            Logger.info(chline)

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


if __name__ == "__main__":
    run_forever(['python', 'test.py'])

为什么有时候能够正常运行,有时候会阻塞?查找资料找到相关解释:

还有Stack Overflow上的解释:

如何解决呢?为了防止这种情况的发生,统一使用out, err = child.communicate()代替read()

© 著作权归作者所有

共有 人打赏支持
f
粉丝 5
博文 127
码字总数 38012
作品 0
崇明
其他
私信 提问
Python, C-Python, Cython代码与GIL的交互

这篇笔记相对Python来说,有点底层,先来解释几个名词: C-Python: 或者CPython,指C实现的Python虚拟机的基础API。最通用的Python就是是基于C实现的,它的底层API称为C-Python API,所有Pyt...

鉴客
2012/02/23
4K
0
vps中部署shadowsocks实现科学上网并搭建telegram代理MTProxy

考虑性能,这里只提供Python版本安装方法。 操作系统为Ubuntu,centos等请使用yum安装。 同时这里提供了两种优化tcp阻塞的解决办法,为ss加速。镜像不存在请自行替换镜像。 安装python环境 ...

hirainn
2018/07/30
0
0
python 命令执行的方法整理

在python开发中,我们常常需要执行命令,修改相关信息。那对于初学者来说,python中如何执行命令呢?今天,小编就为大家分享3种python命令执行的方法。 1. 使用os.system("cmd") 在python中,...

小麦麦子
2015/06/24
1K
0
pip的安装及其使用

安装: Python3 :apt-get install python3-pip Python2 : apt-get install python2-pip 查看版本信息: python3 -m pip -V pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5) p......

Bony
2016/10/29
6
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
2018/07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

uml类图

平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧: 一、类的属性的表示方式 在UML类图中,...

asdf08442a
4分钟前
0
0
Linux下执行脚本报错提示invalid option 3: set: -

1、在环境下执行sh报错invalid option 3: set: - 2、于是换成chmod 777 install.sh改执行权限,并且默认使用#!/bin/bash bash: ./install.sh: /bin/bash^M: bad interpreter: No such file ......

noob_chr
4分钟前
0
0
phpstrom2018激活与汉化

phpstrom2018激活与汉化 方法一. 直接用浏览器打开 http://idea.lanyus.com/ (推荐) 点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串,...

万建宁
6分钟前
0
0
Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs

Kali Linux NetHunter教程Kali NetHunter支持的设备和ROMs NetHunter是一个基于Kali Linux为Nexus设备构建的Android渗透测试平台,其中包括一些特殊和独特的功能。NetHunter支持无线802.11注...

大学霸
15分钟前
1
0
端口可用性探测

在服务器上打开了一个端口,我们需要测试是否开启成功是否可用,可以在本机使用 traceroute (linux)工具 traceroute 是几乎所有 Linux 发行版本预装的网络测试工具,用于跟踪 Internet 协议(...

applepaihs
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部