2010-02-04 2 views
5

Voici mon scénario: Je suis en train d'automatiser certaines tâches à l'aide Paramiko. Les tâches doivent être lancés dans cet ordre (en utilisant la notation (hôte, tâche)): (A, 1), (B, 2), (C, 2), (A, 3), (B, 3) - - essentiellement le démarrage des serveurs et des clients pour certains tests dans le bon ordre. De plus, parce que dans les tests, le réseau peut se dégrader, et parce que j'ai besoin d'une partie des résultats des tests, je voudrais simplement rediriger la sortie vers un fichier.Comment lancer des travaux d'arrière-plan avec paramiko?

Dans les scénarios similaires, la réponse courante consiste à utiliser « écran -m -d » ou utiliser « nohup ». Cependant, avec exec_cmd de paramiko, nohup ne quitte pas réellement. L'utilisation:

bash -c -l nohup test_cmd & 

travail ne marche pas non plus, EXEC_CMD encore des blocs à la fin traiter.

Dans le cas de l'écran, la redirection de sortie ne fonctionne pas très bien, (en fait, le travail ne marche pas du tout le meilleur que je peux comprendre). Donc, après toute cette explication, ma question est la suivante: y a-t-il un moyen facile et élégant de détacher les processus et de capturer la sortie de manière à mettre fin au blocage de param_cmd de paramiko?

Mise à jour

La commande fonctionne de dtach bien pour cela!

Répondre

-1

Je ne sais rien à propos de paramiko et c'est exec_cmd, mais peut-être bashdisown pourrait aider.

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

A cet effet, j'ai écrit un petit script shell que j'Executer sur le côté à distance:

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

Ce qu'il fait: exécute une tâche donnée, canalise la sortie de stdout, stderr à deux différents fichiers et crée un fichier journal qui enregistre lorsque la tâche a été démarrée, quand il a terminé et la valeur de retour de la tâche.

Je copiez d'abord le script à l'hôte distant et exécuter là avec exec_command:

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

+1 une bonne idée de scénario ce que vous pouvez sur le côté éloigné. – sbartell

3

sans utiliser nohup ou de l'écran.

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

ce dit "STDOUT de cmd Redirect dans dev/null, puis de nouveau dans STDERR redirect STDOUT, qui va dans/dev/null. Appuyez ensuite dans l'arrière-plan."

exec_command wont vous attardez sur une sortie (Thats pour ne pas venir), ça va donc revenir.

+0

l'a essayé, n'a pas fonctionné pour moi – chutsu

Questions connexes