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逐行读取文件内容的三种方法
Jan 20 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
Python实现的多进程和多线程功能示例
May 29 Python
详解python:time模块用法
Mar 25 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
Python一键安装全部依赖包的方法
Aug 12 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
利用python在excel中画图的实现方法
Mar 17 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
python属于解释语言吗
Jun 11 Python
python Tkinter模块使用方法详解
Apr 07 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导出oracle库的php代码
2009/04/20 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
2019/04/30 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
详解Python中的join()函数的用法
2015/04/07 Python
Python实现的数据结构与算法之双端队列详解
2015/04/22 Python
python访问系统环境变量的方法
2015/04/29 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Django 使用logging打印日志的实例
2018/04/28 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
Python jieba库用法及实例解析
2019/11/04 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
优秀信贷员先进事迹
2014/01/31 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
知识竞赛主持词
2014/03/26 职场文书
应聘教师求职信
2014/07/19 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
小学班主任教育随笔
2015/08/15 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python