20

Python の multiprocessing モジュールを使用して新しいプロセスを生成しています

次のように :

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

iostatコマンドやマルチプロセッシングモジュールで実行したコマンドのpidを取得したい

私が実行すると:

 d.pid 

このコマンドが実行されているサブシェルの pid が表示されます。

どんな助けも貴重です。

前もって感謝します

4

5 に答える 5

40

@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)
于 2013-06-14T15:46:24.737 に答える
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)
于 2011-06-16T23:32:55.537 に答える
2

あなたの例では、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に、セキュリティに関する考慮事項に注意してください。

于 2010-07-29T18:49:27.013 に答える
1

マルチプロセスモジュールでは、実際にPythonを直接フォークしていて、プロセスツリーの下部に関心のあるプロセスではなくProcessオブジェクトが与えられているため、運が悪いかもしれないと思います。

そのpidを取得する別の方法ですが、おそらく最適な方法ではありませんが、psutilモジュールを使用して、Processオブジェクトから取得したpidを使用してそれを検索することです。ただし、Psutilはシステムに依存するため、ターゲットプラットフォームごとに個別にインストールする必要があります。

注:私は現在、通常使用しているマシンを使用していないため、動作するコードを提供したり、より良いオプションを見つけるために遊んだりすることはできませんが、これを実行する方法を示すことができる場合は、この回答を編集します。

于 2010-07-26T03:45:45.953 に答える