获取子进程的PID

24 投票
5 回答
46070 浏览
提问于 2025-04-16 01:49

我正在使用Python的多进程模块来创建新的进程。

具体代码如下:

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

我想获取使用多进程模块执行的iostat命令的进程ID。

当我执行:

 d.pid 

它给我的是这个命令运行的子shell的进程ID。

任何帮助都将非常有价值。

提前谢谢你。

5 个回答

2

在你的例子中,可以使用 subprocess 这个包。默认情况下,它会执行命令而不使用 shell(就像 os.system() 一样),并且会提供一个进程ID(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 之前,要了解一下 安全方面的考虑

9

因为你似乎在使用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)
45

和 @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)

撰写回答