时间:2010-07-26 03:27:36

标签: python django python-multiprocessing

5 个答案:

答案 0 :(得分:26)

与@rakslice类似,您可以使用 psutil

import signal, psutil
def kill_child_processes(parent_pid, sig=signal.SIGTERM):
    try:
      parent = psutil.Process(parent_pid)
    except psutil.NoSuchProcess:
      return
    children = parent.children(recursive=True)
    for process in children:
      process.send_signal(sig)

答案 1 :(得分:7)

由于您似乎使用的是Unix,因此可以使用快速ps命令获取子进程的详细信息,就像我在此处所做的那样(这是特定于Linux的):

import subprocess, os, signal

def kill_child_processes(parent_pid, sig=signal.SIGTERM):
        ps_command = subprocess.Popen("ps -o pid --ppid %d --noheaders" % parent_pid, shell=True, stdout=subprocess.PIPE)
        ps_output = ps_command.stdout.read()
        retcode = ps_command.wait()
        assert retcode == 0, "ps command returned %d" % retcode
        for pid_str in ps_output.split("\n")[:-1]:
                os.kill(int(pid_str), sig)

答案 2 :(得分:2)

对于您的示例,您可以使用subprocess包。默认情况下,它执行不带shell的命令(如os.system())并提供PID:

from subprocess import Popen
p = Popen('iostat 2 > a.txt', shell=True)
processId = p.pid
p.communicate() # to wait until the end

Popen还提供连接到流程的标准输入和输出的功能。

注意:在使用shell=True之前,请注意security considerations

答案 3 :(得分:1)

答案 4 :(得分:0)

placeNameDesc

这给了我[me@localhost ~]$ echo $$ 30399 [me@localhost ~]$ cat iostat.py #!/usr/bin/env python3.4 import multiprocessing import os d = multiprocessing.Process(target=os.system,args=('iostat 2 > a.txt',)) d.start() [me@localhost ~]$ ./iostat.py & [1] 31068 [me@localhost ~]$ watch -n 3 'pstree -p 30399' [me@localhost ~]$ 的PID,请参见图片。 process tree