2010-12-14 17 views
3

サブプロセスPID(Popen.pid)がpsコマンドから返される値と異なるのはなぜですか?サブプロセスPIDがps出力と異なる

psは、内部でPython(subprocess.call())と別の端末の両方から呼び出されたときに気づいたことがあります。

ここでテストする簡単なPythonのファイルです:

#!/usr/bin/python3 
''' 
Test subprocess termination 
''' 

import subprocess 

command = 'cat' 

#keep pipes so that cat doesn't complain 
proc = subprocess.Popen(command, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE, 
        stdin=subprocess.PIPE, 
        shell=True) 

print('pid = %d' % proc.pid) 
subprocess.call("ps -A | grep -w %s" % command, 
        shell=True) 

proc.terminate() 
proc.wait()    # make sure its dead before exiting pytyhon 

通常psによって報告されたPIDはPopen.pidによって報告されたものより1または2以上です。

+0

私のMacで働いた。 'ps'出力に' grep command' pidがないのは確かですか?私のMacで 'ps -A | grep'は 'cat'、'/bin/sh -c ps -A |という3つのプロセスをリストアップします。 grep -w cat'、 'grep -w cat'です。 – khachik

+2

私はちょうど実現しました - おそらく 'Popen.pid'はシェルプロセスのIDです。ps | grep' cat'のPIDを報​​告しますか? – khachik

+0

それは 'shell = True'でした。誰かが答えを投稿しましたが、もうここにいるようには見えません...誰でもそれを再投稿して受け入れることができます。 – Matthew

答えて

4

コマンドはshell=Trueで実行されるため、サブプロセスによって返されるpidは、コマンドの実行に使用されたシェルプロセスのものです。

関連する問題