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中关键字is与==的区别简述
Jul 31 Python
python实现统计代码行数的方法
May 22 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
Django实现学员管理系统
Feb 26 Python
Python3模拟curl发送post请求操作示例
May 03 Python
python实现关闭第三方窗口的方法
Jun 28 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
python元组和字典的内建函数实例详解
Oct 22 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
python 如何实现遗传算法
Sep 22 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
在Django中使用MQTT的方法
May 10 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代码DOS造成用光网络带宽
2011/03/01 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
静态页面的值传递(三部曲)
2006/09/25 Javascript
使用JavaScript的AngularJS库编写hello world的方法
2015/06/23 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
vuex的使用步骤
2021/01/06 Vue.js
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Python3中列表list合并的四种方法
2019/04/19 Python
python字典改变value值方法总结
2019/06/21 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
远程教育心得体会
2014/01/03 职场文书
新学期校长寄语
2014/01/18 职场文书
合作协议书
2014/04/23 职场文书
3分钟演讲稿
2014/04/30 职场文书
地质灾害防治方案
2014/05/14 职场文书
本科生求职信
2014/06/17 职场文书
法学自荐信
2014/06/20 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
python中的被动信息搜集
2021/04/29 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers