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里disconnect UDP套接字的方法
Apr 23 Python
Python与Java间Socket通信实例代码
Mar 06 Python
requests和lxml实现爬虫的方法
Jun 11 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
python模拟表单提交登录图书馆
Apr 27 Python
如何使用Python 打印各种三角形
Jun 28 Python
python 标准差计算的实现(std)
Jul 29 Python
python pygame实现球球大作战
Nov 25 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
Python ORM编程基础示例
Feb 02 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 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动态生成静态HTML网页的代码
2010/03/04 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
2016/12/25 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
React快速入门教程
2017/01/17 Javascript
Angularjs自定义指令实现分页插件(DEMO)
2017/09/16 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
旅游业大学生创业计划书
2014/01/31 职场文书
2014年新生军训方案
2014/05/01 职场文书
公司委托书范本5篇
2014/09/20 职场文书
商品陈列协议书
2014/09/29 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python