web-dev-qa-db-ja.com

子プロセスのpidを取得する

私はPythonのマルチプロセッシングモジュールを使用して新しいプロセスを生成しています

次のように :

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

Iostatコマンドまたはマルチプロセッシングモジュールを使用して実行されたコマンドのpidを取得したい

私が実行するとき:

 d.pid 

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

どんな助けも価値があります。

前もって感謝します

18
tazim

@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)
28
zhanxw

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)
7
rakslice

あなたの例では、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
Ilia Barahovski

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

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

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

1
whaley
[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 ~]$ 

これにより、iostatのPIDが得られました。画像を参照してください。 process tree

0
Ankur Agarwal