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中使用xlrd获取合并单元格的方法
Dec 26 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
关于Python形参打包与解包小技巧分享
Aug 24 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
python中class的定义及使用教程
Sep 18 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
基于python实现雪花算法过程详解
Nov 16 Python
python文件处理fileinput使用方法详解
Jan 02 Python
python函数定义和调用过程详解
Feb 09 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python更改pip镜像源的方法示例
Dec 01 Python
如何利用pygame实现打飞机小游戏
May 30 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
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
2013/12/29 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
JS将时间秒转换成天小时分钟秒的字符串
2019/07/10 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
Windows下安装python2和python3多版本教程
2017/03/30 Python
python编程使用协程并发的优缺点
2018/09/20 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
消防应急演练方案
2014/02/12 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
音乐学专业求职信
2014/07/22 职场文书
村级四风对照检查材料
2014/08/24 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
投诉书格式范本
2015/07/02 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB