Python subprocess.Popen получить pid процесса, который разветвляется на процесс - PullRequest
2 голосов
/ 14 февраля 2011

Я запускаю команду ssh, которая сама себя разветвляет и будет работать даже после того, как скрипт будет выполнен. Итак, код выглядит так:

ssh_proc = Popen(['ssh', '-f', '-N', '-L', local_forward, local_user_host], stdin=PIPE, stdout=PIPE)
print ssh_proc.pid
stat = ssh_proc.poll()

Как видите, ssh -f форкс ssh как процесс и запускается после того, как скрипт завершен - мне нужно получить pid этого процесса ssh. Оператор print выше, будет распечатывать только pid процесса Popen. Есть предложения?>

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Несмотря на то, что вы передали ключ -f в ssh, ваша программа не контролирует (и не информирует) о том, какие действия выполняет сама программа ssh. прямой способ для вашей программы обнаружить, что ssh разветвился, и найти второй дочерний pid.

Однако возможен косвенный способ получения этой информации. Вы можете перечислить активные процессы и найти тот, чей родительский является ssh_proc.pid.

0 голосов
/ 08 июня 2013

Если вы используете:

shell=True

в качестве параметра вашей команды Popen, ваш pid будет соответствовать pid работающей оболочки вместо команды.Пока процесс не является демоном и отсоединяется от терминала, вы можете убить процесс, просто добавив его. (Вам нужно изменить команду, чтобы НЕ быть списком, а строкой.

Это в документации по питону: http://docs.python.org/2/library/subprocess.html#subprocess.Popen.pid

...