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中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
跟老齐学Python之复习if语句
Oct 02 Python
Python脚本实现代码行数统计代码分享
Mar 10 Python
Python中统计函数运行耗时的方法
May 05 Python
浅谈Python peewee 使用经验
Oct 20 Python
Python自定义线程池实现方法分析
Feb 07 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
numpy数组广播的机制
Jul 12 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
python利用faker库批量生成测试数据
Oct 15 Python
浅析python连接数据库的重要事项
Feb 22 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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
中东人咖啡哲学
2021/03/03 咖啡文化
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
php对数组排序代码分享
2014/02/24 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
微信小程序开发摇一摇功能
2019/11/22 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
Python3.5字符串常用操作实例详解
2019/05/01 Python
详解Python time库的使用
2019/10/10 Python
Python tkinter三种布局实例详解
2020/01/06 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
劳资人员岗位职责
2013/12/19 职场文书
劳动竞赛口号
2014/06/16 职场文书
代办委托书怎么写
2014/08/01 职场文书
医学检验专业自荐信
2014/09/18 职场文书
社区母亲节活动总结
2015/02/10 职场文书
离职信范本
2015/06/23 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python