8
votes

Commande en cours d'exécution avec paramiko Exec_Command Cause le processus de sommeil avant de terminer

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 sshclient.exec_command , il fonctionne un peu, mais éventuellement, le processus de zipping sur la machine distante se couche. Et le recv_exit_status se bloque indéfiniment. Voici le code que j'utilise: xxx

J'ai également essayé d'utiliser zip. xxx

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!

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.

Des idées Pourquoi cela se produit?


1 commentaires

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.


3 Réponses :


2
votes

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'
>>>


0 commentaires

-1
votes

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 exécu_command met fin à la commande ( s dans htop ). J'ai constaté que cela pourrait être en raison de la commande produisant trop de sortie sur starr ou stdout 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 à la fin de ma commande (éliminant ainsi le besoin de paramiko à toucher stdout et stardr ) permet à la même commande de finir via exécu_command .

En résumé, mon flux de travail ressemble à ceci: xxx

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 avoir à modifier la commande pour rediriger stdout et starr .


3 commentaires

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 le même problème avec sous-processus.popen () lors de la définition des deux stdout = sous-processus.Pipe et stardr = Subprocess. Tuyau et n'utilise pas quelque chose comme communiquer () qui sort de sa manière pour éviter les blocages.


@CHARLESDUFFY - Merci. Savez-vous comment éviter les blocages avec Paramiko?


La chose idéale est d'utiliser SELECT () Pour savoir quels canaux sont prêts à lire et à sonder par eux dans cette mesure. Voir TESTS / TEST_TRANSPORT.PY Dans le code PARAMIKO CodeBase pour des exemples, avec chan.setblocking () Pour pouvoir effectuer des lectures non bloquantes sur des canaux Select () dit avoir des données en attente.



0
votes

Ma solution est Client.exec_Command ('My_CMD', get_pty = true) .

get_pty = true peut Demander un pseudo-terminal à partir du serveur .

Donc, si vous pouvez exécuter votre commande en session SSH, alors devriez également utiliser à l'aide de exécu_command () fonction.


0 commentaires