Открытие процесса с Popen и получение PID - PullRequest
28 голосов
/ 03 ноября 2011

Я работаю над изящной маленькой функцией:

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 current процесс, а не запущенный, и новый процесс получает «следующий» pid, который на 1 выше.Если это так, я не могу просто полагаться на возвращение process.pid + 1, поскольку у меня нет гарантии, что оно всегда будет правильным.

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

1 Ответ

27 голосов
/ 03 ноября 2011

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

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

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

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

...