您的位置:首页 > 运维架构

subprocess.popen.kill杀死所有子进程

2011-06-14 11:58 190 查看
使用subprocess模块可创建子进程。

subprocess.
Popen
(
args
, bufsize=0
, executable=None
, stdin=None
, stdout=None
, stderr=None
, preexec_fn=None
, close_fds=False
, shell=False
, cwd=None
, env=None
, universal_newlines=False
, startupinfo=None
, creationflags=0
)

subprocess.Popen(['google-chrome',"http://www.baidu.com"])可打开chrome并显示百度网页。

subprocess.Popen.pid可显示子进程的id,但这只是打开的shell的id,如果此时使用pid.kill是无法杀掉所有子进程的。

杀掉所有子进程,代码:

import sys, os, subprocess, time, signal

p = subprocess.Popen(['google-chrome',"http://www.baidu.com"], close_fds=True, preexec_fn = os.setsid)

print p.pid

time.sleep(5)

# p.kill() #无法杀掉所有子进程,只能杀掉子shell的进程

# p.terminate() #无法杀掉所有子进程

os.killpg( p.pid,signal.SIGUSR1)

time.sleep(3)

注意:

close_fds=True,此时除了文件描述符为0

, 1

and
2,其他子进程都要被杀掉。(

Linux中所有的进程都是进程0的子进程。

pid=1的是init,内核完成之后启动的第一个进程,然后init根据/etc/inittab的内容再去启动其它进程。)

os.setsid(): 使独立于终端的进程(不响应sigint,sighup等),使脱离终端。

SIGUSR1: 用户自定义信号

os.killpg( p.pid,signal.SIGUSR1): 发送SIGUSR1信号到组进程p.pid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: