获得子进程的pid

taz*_*zim 18 python django python-multiprocessing

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

如下 :

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

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

当我执行:

 d.pid 
Run Code Online (Sandbox Code Playgroud)

它给了我运行此命令的子shell的pid.

任何帮助都是有价值的.

提前致谢

zha*_*nxw 31

与@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)
Run Code Online (Sandbox Code Playgroud)

  • 为什么`os.kill(pid.pid,sig)`而不是`pid.send_signal(sig)`?在,为什么不使用API​​ psutil给你的?此外,`pid.send_signal`应该更安全,因为它应该避免竞争条件,例如当给定PID的原始进程完成而另一个使用相同的PID时. (2认同)

rak*_*ice 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)
Run Code Online (Sandbox Code Playgroud)


wha*_*ley 1

我认为使用多进程模块你可能会运气不好,因为你实际上是直接分叉 python 并且在进程树的底部给出了 Process 对象而不是你感兴趣的进程。

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

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