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之??碌某?? target=
Sep 12 Python
详解C++编程中一元运算符的重载
Jan 19 Python
Python实现进程同步和通信的方法
Jan 02 Python
Python使用while循环花式打印乘法表
Jan 28 Python
用python实现刷点击率的示例代码
Feb 21 Python
利用Django模版生成树状结构实例代码
May 19 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 Python
Python如何使用Gitlab API实现批量的合并分支
Nov 27 Python
详解python破解zip文件密码的方法
Jan 13 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
Python logging日志模块 配置文件方式
Jul 12 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
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
PHP 爬取网页的主要方法
2018/07/13 PHP
laravel 数据验证规则详解
2019/10/23 PHP
JQuery toggle使用分析
2009/11/16 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
简单谈谈javascript中的变量、作用域和内存问题
2015/08/30 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
会计专业毕业生自我鉴定
2013/10/29 职场文书
房地产开盘策划方案
2014/02/10 职场文书
工程质量承诺书范文
2014/03/27 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python