Открытие процесса с помощью 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. Кажется, он всегда на 1 ниже, чем правильный PID. Например, он говорит, что процесс начался с 31729, но ps говорит, что он работает на 31730. Каждый раз, когда я пробовал его на 1. Я предполагаю, что PID, который он возвращает, является ПИДом текущей, а не начальный, а новый процесс получает "следующий" pid, который на 1 больше. Если это так, я не могу просто положиться на возврат process.pid + 1, так как у меня нет гарантии, что он всегда будет правильным.

Почему process.pid не возвращает PID нового процесса и как я могу добиться того, что я после?

Ответы

Ответ 1

Из документации по http://docs.python.org/library/subprocess.html:

Popen.pid Идентификатор процесса дочернего процесса.

Обратите внимание, что если вы установите аргумент оболочки True, это процесс ID порожденной оболочки.

Если shell является ложным, он должен вести себя так, как вы ожидаете.