Открытие процесса с помощью 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
является ложным, он должен вести себя так, как вы ожидаете.