文档章节

python subprocess使用记录

纸团猫xh
 纸团猫xh
发布于 2015/07/10 20:32
字数 340
阅读 89
收藏 0

前几天发现服务器上有几个zombie进程,搜索了一下(ps -ef | grep defunct),僵尸进程的父进程是以前写的python同步脚本。

仔细看了下代码,发现在这:

sub = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# other codes

对,父进程开启了子进程后,并无任何动作,子进程执行完成后成为一个僵尸进程。

解决方法很简单,父进程wait子进程即可,但因为标准输出和标准错误输出是管道方式(PIPE),直接使用wait()有可能会导致管道堵塞,python官方文档亦有以下叙述:

Warning
 This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

官方建议适用communicate方法,于是修改代码如下:

sub = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = sub.communicate()

另外一种修改方式,适用于不关心子进程返回结果的场景,可以将STDOUT和STDERR输出结果定向到/dev/dull去,再调用wait()即可,如下:

sub = subprocess.Popen(cmd, shell=True, stdout=open("/dev/null", "w"), stderr=subprocess.STDOUT)
sub.wait()

因为需要子进程的处理信息,选用了第一种方法。重新启动python脚本,不再出现僵尸进程的问题了。


© 著作权归作者所有

共有 人打赏支持
纸团猫xh
粉丝 1
博文 14
码字总数 1935
作品 0
广州
程序员
私信 提问
python脚本监控程序-利用python语言监控python脚本执行情况(日志记录)

需求:现有爬虫程序(名为CNSubAllInd),需要使其一直保持在后台运行(如果执行完毕,立即重新启动,继续执行),并记录其运行日志。 利用python的logging模块来记录日志,利用subprocess模...

fang_faye
2018/10/10
0
0
Python主进程hang住的两个原因

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/52831354 最近使用Python遇到两个非常不好定位的问题,表现都是Python主进程h...

feilengcui008
2016/10/16
0
0
Python标准库06 子进程 (subprocess包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 谢谢Tolbkni Kao帮我纠正错误 这里的内容以Linux进程基础和Linux文本流为基础。subprocess包主要功能是...

张旭0512
2014/05/27
0
0
写了2年python,知道 if __name__ == '__main__' 什么意思吗?

相信刚接触Python的你一定有过如此经历,把所有的代码都写在 下,因为有人告诉你,这样比较符合 Pythonista 的代码风格。 殊不知这段代码的意义并不是一定要存在于执行代码中,而是在日常工作...

上海小胖
03/21
0
0
shell脚本与Python的交互

1、Python针对shell获取传入,输出参数 传入:"$num" 例如: $0表示文件名,$1表示shell获取的第一个参数 输出:通过打印shell结果的方式,输出参数给Python。 例如: echo "{$iplist}",Python调...

一口今心
01/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安装数据库 常见问题

数据库重置密码 如果MySQL数据库用户的密码设置过于简单,数据库在用户登录后会提示重置密码,并且不接受简单的密码。 提示需要重置密码: ERROR 1820 (HY000): You must reset your passwo...

狼王黄师傅
14分钟前
0
0
三种方式拿到反射的入口

public class a_1 { public static void main(String args[]) throws ClassNotFoundException { //三种方式拿到反射的入口 System.out.println(Class.forName("reflect.com.Son")); System.o......

南桥北木
25分钟前
1
0
Macbook 安装PhotoShop 总提示安装包损坏的问题

问题描述 今天在给Mac10.12安装Adobe Photoshop的时候一直提示Error The installation cannot continue as the installer file may be damaged. Download the installer file again.起初以为......

Carlyle_Lee
32分钟前
1
0
Java 帝国对 Python 的渗透能成功吗?哈哈

引子 Java 帝国已经成立20多年,经过历代国王的励精图治,可以说是地大物博,码农众多。 可是国王依然不满足,整天想着如何继续开拓疆土, 这一天晚上他又把几个重臣招来商议了。 IO大臣说:...

边鹏_尛爺鑫
今天
14
0
分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部