python subprocess 杀掉全部派生的子进程方法


Posted in Python onJanuary 16, 2017

下面就是今天下午的研究成果。

发布系统需要响应用户的中断请求,需要在GET方法中杀掉由subprocess派生的子进程,刚开始直接用os.kill 发现子进程的子进程无法kill,谷歌了一些,发现kill可以干掉进程组,于是测试,但是默认情况下,subprocess派生的进程组和主程序,也就是我的web.py进程是在一个进程组里的,这要是kill了,那就调的了。

继续翻google,看subprocess的document时发现这个变量:

subprocess.CREATE_NEW_PROCESS_GROUPA Popen creationflags parameter to specify that a new process group will be created. This flag is necessary for using os.kill() on the subprocess.

This flag is ignored if CREATE_NEW_CONSOLE is specified.

比较高兴,以为能解决问题了,结果测试半天,才了解这玩意是only windows的,我去啊,不过想到了,win能做到的,linux肯定也可以,于是定位到

preexec_fn

又是一通google,不是对象吗,弄了个setpgid(0,0) 测试了,子进程还是和主调进程属于同一个进程组,后来灵机一动:

preexec_fn = os.setpgrp

这样竟然解决了新生成进程组的问题。

继续努力,后面遇到的就是僵死进程的问题了,os.waitpid了一下就解决了。

刚开始waitpid的时候,还在linxu上man了半天,看着linxu手册里的参数,还是不放心啊,结果python里的os.waitpid竟然没有那么多参数,而且没有返回值,简陋啊。不过正解决了我的问题。

下面是今天的完全测试代码

 

[liufeng@1.2.3.4 kill-subprocess]$ cat sub-process.py 
import subprocess
import os
import time

def my_func():

#派生两个子进程,子进程里又派生几个sleep的孙子进程,主要是为了测试kill进程组。

run_str2 = '/bin/sh test.sh'
run_str = '/bin/sh test_quick.sh'
cmd2 = run_str.split()
cmd = run_str.split()

#测试了一些个preexec_fn的值,最终发现能用的,对python的对象的概念还是不理解啊,新手,新手。

#p = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)

#p = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, creationflags = 0)

p = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setpgrp )

p2 = subprocess.Popen(cmd2, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setpgrp )

#@p = subprocess.Popen(cmd, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setpgid(0, 0) )


pid = p.pid
pgid = os.getpgid(pid)
print "pid: %d\n" %pid
print "pgid: %d\n" %pgid
return pid


pid = my_func()
#p.wait()
print "now , sleep 2s ,then , os.kill gpid %d" % pid
time.sleep(20)


a = os.kill(-pid, 9)
print "kill,return:"
print a


# kill的时候,我测试了kill 没有权限的root进程,会报错:权限不允许
# 测试了kill p p2 都可以kill
#a = os.kill(2445, 9)
#print "kill root process 2445 ,return:"
#print a
#p.wait()
#os.waitpid(pgid, 0)
# 2445 is a root process
#os.waitpid(2445, 0)
#os.waitpid(p2.pid, 0)
os.waitpid(pid, 0)
print "waitpid,return:"
print a
time.sleep(22)


print "done..."


#p.terminate()
#p.kill()
#p.wait()
#
#time.sleep(40)
#os.kill(pid, 9)

以上这篇python subprocess 杀掉全部派生的子进程方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
K-近邻算法的python实现代码分享
Dec 09 Python
python实现TF-IDF算法解析
Jan 02 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
20行python代码实现人脸识别
May 05 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
python解释器pycharm安装及环境变量配置教程图文详解
Feb 26 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
python实现邮件循环自动发件功能
Sep 11 Python
Python os和os.path模块详情
Apr 02 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 #Python
python 根据pid杀死相应进程的方法
Jan 16 #Python
总结python实现父类调用两种方法的不同
Jan 15 #Python
利用python程序帮大家清理windows垃圾
Jan 15 #Python
Python科学计算之NumPy入门教程
Jan 15 #Python
Python科学计算之Pandas详解
Jan 15 #Python
使用pyecharts无法import Bar的解决方案
Apr 23 #Python
You might like
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
laravel入门知识点整理
2020/09/15 PHP
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[01:05:56]Liquid vs VP Supermajor决赛 BO 第二场 6.10
2018/07/04 DOTA
python获得一个月有多少天的方法
2015/06/04 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python实现多人聊天室
2020/03/31 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
python 监控logcat关键字功能
2020/09/04 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
考试没考好检讨书
2014/01/31 职场文书
项目总经理岗位职责
2014/02/14 职场文书
学生鉴定评语大全
2014/05/05 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
创业计划书之校园超市
2019/09/12 职场文书