2011-11-03 3 views
15

を取得:はpopenのでプロセスを開くと、私は気の利いた小さな機能に取り組んでいるPID

def startProcess(name, path): 
    """ 
    Starts a process in the background and writes a PID file 

    returns integer: pid 
    """ 

    # Check if the process is already running 
    status, pid = processStatus(name) 

    if status == RUNNING: 
     raise AlreadyStartedError(pid) 

    # Start process 
    process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True) 

    # Write PID file 
    pidfilename = os.path.join(PIDPATH, name + '.pid') 
    pidfile = open(pidfilename, 'w') 
    pidfile.write(str(process.pid)) 
    pidfile.close() 

    return process.pid 

問題はprocess.pidが正しいPIDではないということです。それは常に正しいPIDより1低いようです。例えば、それはプロセスが31729で始まったと言いますが、psは31730で動作していると言います。私が試したたびに、私はそれが返すPIDを推測しています。のPIDは現在です。 1つを開始し、新しいプロセスは1つ上位の '次の' pidを取得します。この場合、私はそれが常に正しいことを保証するものではないので、process.pid + 1を返すことに頼るだけではありません。

なぜ、process.pidが新しいプロセスのPIDを返さないのですか。後でどのように動作するのですか? http://docs.python.org/library/subprocess.htmlのドキュメントから

+1

'shell = True'とあなたの'> 'を削除してみてください。 – Blender

+0

私は同じ問題があり、難しい方法を見つけました。それは常にPID + 1ではなく、最初はありましたが、現在は+2を与えています – andrei

答えて

19

Popen.pid The process ID of the child process.

Note that if you set the shell argument to True, this is the process ID of the spawned shell.

shellがfalseの場合は、期待どおり、それが振る舞うべきは、私は思います。

+0

pythonが動作する相対パスとして 'shell = True'が必要でした。絶対パスで置き換え、 'shell'をfalseに設定します。情報のおかげで! – Hubro

+1

まず、os.path.abspathにパスを渡すと、それが修正されます。 http://docs.python.org/library/os.path.html –

+0

Nahは 'os.path.abspath( 'python')'を実行するだけで、作業ディレクトリに「python」を返します。 '/ root/python' – Hubro

関連する問題