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 相关文章推荐
使用SAE部署Python运行环境的教程
May 05 Python
python快速建立超简单的web服务器的实现方法
Feb 17 Python
pyqt5的QWebEngineView 使用模板的方法
Aug 18 Python
在python中bool函数的取值方法
Nov 01 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
python django生成迁移文件的实例
Aug 31 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
python 实现单例模式的5种方法
Sep 23 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
python字符串的多行输出的实例详解
Jun 08 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
Javascript UrlDecode函数代码
2010/01/09 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
python函数超时自动退出的实操方法
2020/12/28 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
2014超市双十一活动策划方案
2014/09/29 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
小学教研工作总结2015
2015/05/13 职场文书
主持稿开场白
2015/06/01 职场文书
常住证明范本
2015/06/23 职场文书
公司车队管理制度
2015/08/04 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记