2010-02-04 2 views
5

Вот мой сценарий: я пытаюсь автоматизировать некоторые задачи с помощью Paramiko. Задачи должны быть начаты в этом порядке (с использованием обозначения (хост, задача)): (A, 1), (B, 2), (C, 2), (A, 3), (B, 3) - - по существу, запуск серверов и клиентов для некоторого тестирования в правильном порядке. Кроме того, поскольку в тестах сеть может быть отключена, и потому, что мне нужна часть результатов тестов, я хотел бы просто перенаправить вывод в файл.Как запустить фоновые задания w/paramiko?

В подобных сценариях общий ответ - использовать «экран -m -d» или использовать «nohup». Однако с exec_cmd paramiko nohup фактически не выходит. Использование:

bash -c -l nohup test_cmd & 

не работает, exec_cmd все еще блокирует процесс завершения.

В случае экрана выходное перенаправление не очень хорошо работает (на самом деле, работает не так, как я могу понять).

Итак, после всего этого объяснения, мой вопрос: есть ли простой элегантный способ отделить процессы и сделать вывод таким образом, чтобы завершить блокировку exec_cmd paramiko?

Update

dtach команда работает хорошо для этого!

ответ

-1

Я ничего не знаю о paramiko, и это exec_cmd, но может быть bash's disown может помочь.

#!/bin/bash -l 
test_cmd & 
disown test_cmd 
0

Для этого я написал небольшой скрипт, который я выполнить на удаленной стороне:

#!/bin/bash 

# check for command line arguments 
if [ $# -lt 2 ]; then 
     echo "usage: runcommand.sh EXECUTIONSTRING TASKNAME" 
     exit -1 
fi 

taskname=$2 
execstr=$1 
logfile=$taskname.log 

echo START $taskname > $logfile 
echo OWNPID $BASHPID >> $logfile 
stime=`date -u +"%Y-%m-%d_%H-%M-%S"` 
stimes=`date -u +"%s"` 
echo STARTTIME $stime >> $logfile 
echo STARTTIMES $stimes >> $logfile 
# execute program 
$execstr 1>$taskname.stdout 2>$taskname.stderr 
echo RETVAL $? >> $logfile 

stime=`date -u +"%Y-%m-%d_%H-%m-%S"` 
stimes=`date -u +"%s"` 
echo STOPTIME $stime >> $logfile 
echo STOPTIMES $stimes >> $logfile 
echo STOP $taskname >> $logfile 

Что он делает: выполняет данную задачу, трубы на выходе стандартный вывод, STDERR к двум различным файлы и создает файл журнала, который сохраняется при запуске задачи, когда он заканчивается, и возвращаемое значение задачи.

Тогда я первый скопировать скрипт на удаленный хост и выполнить его там с exec_command:

command = './runcommand.sh "{execpath}" "{taskname}" > /dev/null 2>&1 &' 
ssh.exec_command(command.format(execpath=anexecpath, taskname=ataskname) 
+0

+1 его хорошая идея, чтобы сценарий, что вы можете на удаленной стороне. – sbartell

3

без использования поЬира или экрана.

def command(channel, cmd): 
    channel.exec_command(cmd + ' > /dev/null 2>&1 &') 

это говорит «Перенаправление STDOUT из ЦМД в Dev/нуль, а затем перенаправить STDERR обратно в STDOUT, который входит в/DEV/нуль. Затем вставьте его в фоновом режиме.»

exec_command не будет зависать на любом выходе (это не придет), таким образом он вернется.

+0

попробовал, не работал для меня – chutsu

Смежные вопросы