web-dev-qa-db-ja.com

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で実行されていると表示されます。試行するたびに1ずつオフになります。 currentプロセス、開始されたプロセスではなく、新しいプロセスは1つ高い 'next' pidを取得します。これが当てはまる場合、process.pid + 1常に正しいことを保証するものではないので。

なぜprocess.pidは、新しいプロセスのPIDを返します。そして、私が後の動作をどのように達成できますか?

28
Hubro

http://docs.python.org/library/subprocess.html のドキュメントから:

Popen.pid子プロセスのプロセスID。

Shell引数をTrueに設定した場合、これは生成されたシェルのプロセスIDであることに注意してください。

Shellがfalseの場合、期待どおりに動作するはずです。

29
krousey