J'utilise le module Paramiko de Python sur SSH dans une machine à distance et un dossier TAR / ZIP avec beaucoup de fichiers (plus de 14 000 dossiers et 60 + concerts de données). Le zip résultant est d'environ 10 gigs lui-même. Maintenant, je peux exécuter la commande à zip / goudron directement de la machine sans problème. Cependant, lorsque j'essaie d'exécuter la même commande via J'ai également essayé d'utiliser zip. P> dans les deux cas, si j'exécute la commande Directement de la machine distante, il finit de zipper / taring. Le fichier de résultats est comme 9 gigs. Mais lorsque je l'essaie de Paramiko, cela commence, dépasse une demi-voie (6h 6h), puis le processus va dormir! P> J'ai surveillé les processus de la machine distante à l'aide de haut en haut, et le Zip / Tar va commencer à courir, mais cela finira par aller dormir avant de finir. Et le script Python sera suspendu indéfiniment. P> Des idées Pourquoi cela se produit? P> P> sshclient.exec_command code>, il fonctionne un peu, mais éventuellement, le processus de zipping sur la machine distante se couche. Et le
recv_exit_status code> se bloque indéfiniment. Voici le code que j'utilise:
3 Réponses :
Cela pourrait être un délai d'attente liée. Essayez d'ajouter Timeout code> param (en secondes) à l'appel:
exécu_command (timeout = 20 * 60) code>. C'est un exemple de 20 min.
Voir la chaîne DOC de cette méthode pour plus d'informations:
>>> timeout = 30
>>> import time
>>> endtime = time.time() + timeout
>>> while not stdout.channel.eof_received:
... sleep(1)
... if time.time() > endtime:
... stdout.channel.close()
... break
>>> stdout.read()
'Starting XXX: \n[ OK ]\rProgram started . . .\n'
>>>
Je viens d'avoir une chose similaire à moi. Je peux exécuter une commande lors de la connexion via ssh, mais en cours d'exécution En résumé, mon flux de travail ressemble à ceci: p> Ceci fonctionne Pour l'instant, mais je serais toujours très intéressé si quelqu'un sait comment corriger le problème d'origine sans em> avoir à modifier la commande pour rediriger exécu_command code> met fin à la commande (
s code> dans
htop code>). J'ai constaté que cela pourrait être em> en raison de la commande produisant trop de sortie sur
starr code> ou
stdout code> que j'ai rassemblé peut déborder des tampons, causant la Signalez que la commande a fini d'être perdue, mais je ne suis certainement aucun expert. Ce que j'ai trouvé, c'est que l'ajout
> / dev / null 2> & 1 code> à la fin de ma commande (éliminant ainsi le besoin de paramiko à toucher
stdout code> et
stardr code>) permet à la même commande de finir via
exécu_command code>.
stdout code> et
starr code >. p> p>
Si vous lisez continuellement les deux (vs un, puis l'autre), il n'ya pas de potentiel que l'auteur distant de bloquer. Ongle entre exactement i> le même problème avec sous-processus.popen () code> lors de la définition des deux
stdout = sous-processus.Pipe code> et
stardr = Subprocess. Tuyau code> et n'utilise pas quelque chose comme
communiquer () code> qui sort de sa manière pour éviter les blocages.
@CHARLESDUFFY - Merci. Savez-vous comment éviter les blocages avec Paramiko?
La chose idéale i> est d'utiliser SELECT () CODE> Pour savoir quels canaux sont prêts à lire et à sonder par eux dans cette mesure. Voir
TESTS / TEST_TRANSPORT.PY CODE> Dans le code PARAMIKO CodeBase pour des exemples, avec
chan.setblocking () code> Pour pouvoir effectuer des lectures non bloquantes sur des canaux
Select () code> dit avoir des données en attente.
Ma solution est Donc, si vous pouvez exécuter votre commande en session SSH, alors devriez également utiliser à l'aide de Client.exec_Command ('My_CMD', get_pty = true) code>. P>
get_pty = true code> peut Demander un pseudo-terminal à partir du serveur fort>. p>
exécu_command () code> fonction. p>
S'il vous plaît voir ma réponse mise à jour: Stackoverflow.com/a/36736691/4988742 et laissez-moi savoir si cela le résout. Si vous avez déjà résolu votre solution, merci de partager votre solution.