Вызов скрипта Python, который создает подпроцесс через ssh зависает - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть несколько сценариев, которые используются для запуска похожих процессов на нескольких серверах.Я хотел бы сжать их до одного скрипта Python, называемого «START», но когда он запускается через ssh, происходит что-то странное.

$ ./START APP_A работает как положено: APP_A запускается и начинает делать свое дело.Управление возвращается на консоль немедленно (до завершения APP_A).

$ ssh localhost /path_to/START APP_A вроде работает: APP_A запускается и начинает свое дело, но ssh не выводит вывод на экран или возвращает управление вконсоль, пока не завершится APP_A.

Я предполагаю, что это проблема с сигналами или дескрипторами файлов, но я в растерянности.Вот вызов Popen, который, кажется, вызывает проблему:

sub = subprocess.Popen(shlex.split(cmd), stdout=open(file_out, 'a+'), stderr=subprocess.STDOUT, close_fds=True)
print 'New PID:', sub.pid

Я использую Python 2.4.3 на RHEL.

EDIT: Обтекание скрипта Pythonпохоже на работу:

DIR="$( cd "$( dirname "$0" )" && pwd )"
pushd $DIR >> /dev/null
./START $1 &
popd >> /dev/null

Ответы [ 3 ]

0 голосов
/ 27 сентября 2011

Когда вы делаете:

ssh some_host remote_command remote_cmd_param

, то это нормально, что ssh не возвращает управление до того, как будет выполнена команда remote_command.Если вы хотите иначе, вам нужно отправить его в фоновый режим, добавив в конце &.

ssh перенаправляет стандартный вывод remote_command на свой (локальный) стандартный вывод.Если вы не видите никаких выходных данных, это может быть связано с тем, что remote_command не устанавливает ни одного в стандартный вывод, а пытается, например, отправить его на консоль.Вот почему вы не можете сделать:

ssh remote_host mc # or any other command using terminal
0 голосов
/ 27 сентября 2011

Вы должны поместить это в START_APP_A

nohup /path/to/APP_A >/path/to/log 2>&1 </dev/null &

Тогда это сработает, и все выходные данные из APP_A попадут в файл журнала, который вы можете просмотреть, когда вам нужно.

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

0 голосов
/ 27 сентября 2011

Не используйте shlex для вызова вместе с подпроцессом. Это не делает то, что вы ожидаете .Вместо этого передайте подпроцессу список команд Python, например

subprocess.Popen(['/some/program', 'arg1', 'arg2', 'arg3'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...