国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python subprocess 殺掉全部派生的子進程方法

2019-11-25 16:24:20
字體:
來源:轉載
供稿:網友

下面就是今天下午的研究成果。

發布系統需要響應用戶的中斷請求,需要在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 subprocessimport osimport timedef 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.pidpgid = os.getpgid(pid)print "pid: %d/n" %pidprint "pgid: %d/n" %pgidreturn pidpid = my_func()#p.wait()print "now , sleep 2s ,then , os.kill gpid %d" % pidtime.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 atime.sleep(22)print "done..."#p.terminate()#p.kill()#p.wait()##time.sleep(40)#os.kill(pid, 9)

以上這篇python subprocess 殺掉全部派生的子進程方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都江堰市| 承德市| 竹溪县| 苍梧县| 河南省| 海南省| 松阳县| 积石山| 灯塔市| 阳朔县| 盐亭县| 连州市| 利川市| 雷州市| 郎溪县| 阿巴嘎旗| 岢岚县| 普洱| 邛崃市| 旺苍县| 库车县| 花莲县| 花莲市| 镇平县| 霸州市| 分宜县| 策勒县| 灵寿县| 邓州市| 什邡市| 武宣县| 陆川县| 孝感市| 商洛市| 萨迦县| 麻栗坡县| 潼关县| 汾阳市| 双流县| 屯留县| 福建省|