de base paramiko exec_command aider
Je suis un nouveau paramiko utilisateur et éprouve des difficultés à exécuter des commandes sur un serveur distant avec paramiko. Je veux exporter un chemin d'accès et également exécuter un programme appelé tophat
en arrière-plan. Je peux me connecter bien avec paramiko.sshclient()
mais mon code pour exec_command
a pas de résultats.
stdin, stdout, sterr = ssh.exec_command('export PATH=$PATH:/proj/genome/programs
/tophat-1.3.0/bin:/proj/genome/programs/cufflinks-1.0.3/bin:/proj/genome/programs/
bowtie-0.12.7:/proj/genome/programs/samtools-0.1.16')
stdin, stdout, sterr = ssh.exec_command('nohup tophat -o /output/path/directory -I
10000 -p 8 --microexon-search -r 50 /proj/genome/programs/bowtie-0.12.7/indexes
/ce9 /input/path/1 /input/path/2 &')
il n'y a pas de nohup.out
fichier python et passe à la ligne suivante avec pas de messages d'erreur. J'ai essayé sans nohup
ainsi et le résultat est le même. J'essayais de suivre ce tutoriel paramiko.
suis-je à l'aide de exec_command
mal?
La deuxième commande s'exécute dans un environnement différent de la première, de sorte que le
Vous feriez mieux de mettre juste la variable d'environnement dans la ligne. Qui est:
export
n'aura aucun effet.Vous feriez mieux de mettre juste la variable d'environnement dans la ligne. Qui est:
ssh.exec_command('PATH=/bin:/usr/bin:etcetera nohup ...')
; cela va exporter pour la simple commande uniquement, ce qui est exactement ce que vous voulez.OriginalL'auteur pieguy | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
J'ai aussi couru dans le même problème et après avoir regardé cet article et cette réponse, je vois la solution est d'appeler le
recv_exit_status()
méthode de la chaîne. Voici mon code:Maintenant, mon code sera bloqué jusqu'à ce que la commande à distance est fini. Cette méthode est expliquée ici, et s'il vous plaît prêter attention à l'avertissement.
Enlevé les points-virgules. Quand j'ai écrit le code ci-dessus, j'ai juste tourné vers Python à partir de C++. 🙂
OriginalL'auteur yaobin
exec_command() est non bloquant, et il envoie la commande au serveur Python va exécuter le code suivant.
Je pense que vous devriez attendre pour l'exécution de la commande se termine et faire le reste du travail par la suite.
"du temps.sleep(10)" pourrait aider qui exige "importer".
Certains exemples montrent que vous avez pu lire à partir de la sortie standard (stdout) ChannelFile objet, ou tout simplement à l'aide de stdout.readlines(), il semble tout lire la réponse du serveur, suppose que cela pourrait aider.
Votre code, au-dessus de 2 lignes de exec_command, ils sont effectivement en cours d'exécution dans les différents exec sessions. Je ne sais pas si cela a un impact dans votre cas.
Je vous suggère de prendre un regard sur les démos dans le demos, ils sont à l'aide de Canal classe, et qui a la meilleure API pour faire bloquant /non bloquant l'envoi pour les deux et shell exec.
OriginalL'auteur terry
Vous le mieux pour charger le bash_profile avant d'exécuter votre commande. Sinon vous risquez d'obtenir un "command not found' exception.
Par exemple,j'écris la commande
command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql'
dans le but de dumping d'une table MysqlPuis-je charger le bash_profile manuellement avant que le dumping de commande en tapant
. ~/.profile; .~/.bash_profile;
.Exemple
.profile
ou d'autres shell interactif fichiers de démarrage. C'est une solution de contournement lorsque vous avez bêtement défini par exemple, un alias dans votre fichier de démarrage ou avez besoin d'exécuter une commande qui n'est pas dans votrePATH
; mais le correctif pour l'ex est tout simplement de ne pas le faire (à préciser à la commande à la main au lieu d'essayer d'utiliser l'alias) et pour le second à passer un chemin d'accès complet à la commande (par exemple,/usr/lib/sendmail
au lieu de simplementsendmail
).OriginalL'auteur Marvin W