Подтвердить что ты не робот

Получение pid дочернего процесса

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

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

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

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

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

 d.pid 

он дает мне pid подоболочки, в которой эта команда запущена.

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

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

4b9b3361

Ответ 1

Подобно @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)

Ответ 2

Поскольку вы, как представляется, используете 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)

Ответ 3

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

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

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

Ответ 4

В вашем примере вы можете использовать пакет 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 обратите внимание на соображения безопасности.