получить PID от paramiko

Я не могу найти на это простого ответа: я использую paramiko для входа в систему и удаленного выполнения ряда процессов, и мне нужны PID каждого процесса, чтобы проверить их позже. Похоже, что в paramiko нет функции для получения PID выполненной команды, поэтому я попытался использовать следующее:

stdin,stdout,stderr = ssh.exec_command('./someScript.sh &;echo $!;)

Я думал, что затем парсинг через stdout вернет PID, но это не так. Я предполагаю, что мне нужно запустить скрипт в фоновом режиме, чтобы иметь PID (пока он запущен). Есть ли более простой и очевидный способ получить PID?


person radpotato    schedule 26.03.2012    source источник
comment
@JohnZwinck, решение, которое не требует настройки удаленной команды, потребует исправления демона SSH на сервере, а не модуля paramiko, запущенного на клиенте. Ответ @ SørenLøvborg кажется мне наиболее правильным.   -  person lanzz    schedule 02.02.2014


Ответы (2)


Вот способ получить идентификатор удаленного процесса:

def execute(channel, command):
    command = 'echo $$; exec ' + command
    stdin, stdout, stderr = channel.exec_command(command)
    pid = int(stdout.readline())
    return pid, stdin, stdout, stderr
person Søren Løvborg    schedule 04.01.2013
comment
Для большей безопасности вы можете использовать && вместо ; после команды echo. Таким образом, нет шансов, что вы прочитаете не то, что PID. - person John Zwinck; 03.02.2014
comment
@JohnZwinck: Ну, наверное. echo $$ требуется POSIX и встроенной утилитой практически во всех реализациях оболочки с 1987 года или около того. Если echo $$ как-то не удастся, я бы сказал, что все ставки сняты. :-) - person Søren Løvborg; 04.02.2014
comment
@ SørenLøvborg Разве $$ не является PID оболочки (не выполняемой «команды»)? - person David Doria; 07.05.2014
comment
@DavidDoria То же самое. :-) Использование exec означает, что выполняемая команда наследует PID оболочки. - person Søren Løvborg; 11.05.2014

Обычно я использую стандартную команду UNIX pidof <command name>, когда проверяю процесс позже. AFAIK нет более простого способа.

Хорошо, учитывая ваш комментарий, вы можете решить эту проблему, заключив свой ./someScript.sh в процесс Python, который использует модуль подпроцесса.

wrapper.py:

import subprocess
import sys
proc = subprocess.Popen(sys.argv[1])
print proc.pid
proc.wait() #probably

Тогда беги

stdin,stdout,stderr = ssh.exec_command('./wrapper.py ./someScript.sh')

и прочтите вывод

person Gurgeh    schedule 26.03.2012
comment
Верно, но для меня это потребует несколько уродливого взлома - я вхожу на удаленные серверы, на которых, вероятно, есть несколько пользователей, и на них наверняка запущено несколько экземпляров моего программного обеспечения. Я ищу PID конкретного задания, которое я запустил с помощью exec_command. - person radpotato; 29.03.2012