获取子进程的PID
我正在使用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)