получение pid дочернего процесса - PullRequest
15 голосов
/ 26 июля 2010

Я использую многопроцессорный модуль python для запуска нового процесса

следующим образом:

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

Я хочу получить pid команды iostat или команду, выполненную с помощью многопроцессорного модуля

Когда я выполняю:

 d.pid 

, это дает мне pid subshell, в котором выполняется эта команда.

Любая помощь будет полезна.

Заранее спасибо

Ответы [ 5 ]

27 голосов
/ 14 июня 2013

Подобно @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)
7 голосов
/ 17 июня 2011

Поскольку вы, похоже, используете 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)
1 голос
/ 29 июля 2010

Для вашего примера вы можете использовать пакет subprocess.По умолчанию он выполняет команду без оболочки (например, 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 ознакомьтесь с соображениями безопасности .

1 голос
/ 26 июля 2010

Я думаю, что с многопроцессорным модулем вам может не повезти, поскольку вы действительно разветвляетесь на python и получаете этот объект Process вместо интересующего вас процесса в нижней части дерева процессов.

Альтернативный, но, возможно, не оптимальный способ получить этот pid - использовать модуль psutil , чтобы найти его, используя pid, полученный из вашего объекта Process.Однако Psutil зависит от системы и должен быть установлен отдельно на каждой целевой платформе.

Примечание. В настоящее время я не на машине, с которой обычно работаю, поэтому я не могу ни предоставить рабочий код, ни поиграться, чтобы найти лучший вариант, но отредактирую этот ответ, когда смогу показать вамможет быть в состоянии сделать это.

0 голосов
/ 28 октября 2018
[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 iostat См. Изображение.process tree

...