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网络编程实例简析
Sep 26 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
Python 通过pip安装Django详细介绍
Apr 28 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
python 字符串追加实例
Jul 20 Python
python 读取修改pcap包的例子
Jul 23 Python
python函数调用,循环,列表复制实例
May 03 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
python 如何将两个实数矩阵合并为一个复数矩阵
May 19 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
基于文本的留言簿
2006/10/09 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
PHP 与 UTF-8 的最佳实践详细介绍
2017/01/04 PHP
js停止输出代码
2008/07/20 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
JavaScript字符串对象(string)基本用法示例
2017/01/18 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
Python实现视频下载功能
2017/03/14 Python
flask中过滤器的使用详解
2018/08/01 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
通过代码实例了解Python sys模块
2020/09/14 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
个人评价范文分享
2014/01/11 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
离职证明格式样本
2015/06/12 职场文书
网吧员工管理制度
2015/08/05 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
HTML基本元素标签介绍
2022/02/28 HTML / CSS
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技