私はPythonのマルチプロセッシングモジュールを使用して新しいプロセスを生成しています
次のように :
import multiprocessing
import os
d = multiprocessing.Process(target=os.system,args=('iostat 2 > a.txt',))
d.start()
Iostatコマンドまたはマルチプロセッシングモジュールを使用して実行されたコマンドのpidを取得したい
私が実行するとき:
d.pid
このコマンドが実行されているサブシェルのpidが表示されます。
どんな助けも価値があります。
前もって感謝します
@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)
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)
あなたの例では、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
を使用する前に、 セキュリティ上の考慮事項 に注意してください。
マルチプロセスモジュールでは、実際にpythonを直接フォークしていて、プロセスツリーの下部にある関心のあるプロセスの代わりにそのProcessオブジェクトが与えられているため、運が悪いかもしれないと思います。
そのpidを取得する別の方法ですが、おそらく最適な方法ではありませんが、 psutil モジュールを使用して、Processオブジェクトから取得したpidを使用してそれを検索します。ただし、Psutilはシステムに依存するため、ターゲットプラットフォームごとに個別にインストールする必要があります。
注:私は現在、通常使用しているマシンを使用していないため、動作するコードを提供したり、より良いオプションを見つけるために遊んだりすることはできませんが、これを行う方法を示すことができたら、この回答を編集します。
[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 ~]$