2010-02-04 9 views
5

Aquí está mi situación: estoy tratando de automatizar algunas tareas usando Paramiko. Las tareas deben iniciarse en este orden (usando la notación (host, tarea)): (A, 1), (B, 2), (C, 2), (A, 3), (B, 3) - - esencialmente comenzando servidores y clientes para algunas pruebas en el orden correcto. Además, debido a que en las pruebas, la red puede quedar mal y porque necesito algo de la salida de las pruebas, me gustaría simplemente redirigir la salida a un archivo.¿Cómo inicio trabajos en segundo plano con paramiko?

En situaciones similares, la respuesta común es usar 'screen -m -d' o usar 'nohup'. Sin embargo, con exec_cmd de paramiko, nohup en realidad no sale. Usando:

bash -c -l nohup test_cmd & 

tampoco funciona, exec_cmd todavía bloques para procesar el final.

En el caso de la pantalla, la redirección de salida no funciona muy bien, (en realidad, no funciona en todo lo mejor que puedo imaginar).

Entonces, después de toda esa explicación, mi pregunta es: ¿hay una manera fácil y elegante de separar procesos y capturar resultados de tal manera que se termine el bloqueo de exem_cmd de paramiko?

actualización comando funciona

El dtach muy bien para esto!

Respuesta

-1

No sé nada sobre paramiko y es exec_cmd, pero tal vez bash 's disown podría ayudar.

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

Para este propósito he escrito un pequeño script de shell, que ejecuto en el lado remoto:

#!/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 

Lo que hace: se ejecuta una tarea determinada, canaliza la salida de stdout, stderr a dos diferentes archivos y crea un archivo de registro que guarda cuando se inició la tarea, cuando terminó y el valor de retorno de la tarea.

Luego de la primera copia la secuencia de comandos en la máquina remota y ejecutarlo allí con exec_command:

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

+1 es una buena idea para programar lo que pueda en el lado remoto. – sbartell

3

sin utilizar nohup o pantalla.

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

este dice "redirección de la salida estándar de cmd en dev/null, entonces redirigir STDERR de nuevo en la salida estándar, que entra en/dev/null. Luego empuje en el fondo."

exec_command no se cuelga en ningún resultado (eso no viene), por lo tanto, volverá.

+0

lo probé, no funcionó para mí – chutsu

Cuestiones relacionadas