20

我正在使用 python 的多处理模块来生成新进程

如下 :

import multiprocessing
import os
d = multiprocessing.Process(target=os.system,args=('iostat 2 > a.txt',))
d.start()

我想获取 iostat 命令的 pid 或使用多处理模块执行的命令

当我执行:

 d.pid 

它给了我运行这个命令的子shell的pid。

任何帮助都是有价值的。

提前致谢

4

5 回答 5

40

与@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)
于 2013-06-14T15:46:24.737 回答
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)
于 2011-06-16T23:32:55.537 回答
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安全注意事项

于 2010-07-29T18:49:27.013 回答
1

我认为对于多进程模块,您可能会不走运,因为您实际上是直接派生 python,并且在进程树的底部给出了 Process 对象而不是您感兴趣的进程。

获取该 pid 的另一种方法(但可能不是最佳方法)是使用psutil模块使用从 Process 对象获得的 pid 来查找它。但是,Psutil 依赖于系统,需要在每个目标平台上单独安装。

注意:我目前不在我通常使用的机器上,因此我无法提供工作代码,也无法四处寻找更好的选择,但我会在可以时编辑此答案以展示您如何能够做到这一点.

于 2010-07-26T03:45:45.953 回答
1
[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 ~]$ 

iostat这给了我See image的 PID 。进程树

于 2018-10-28T06:04:29.117 回答