Kontext:
Ich habe Code geschrieben mit pexpect
, dessen Aufgabe es ist, die Ausgabe eines Befehls "live" zu geben. I.e. Drucken Sie etwas aus, wenn ein Befehl eine Ausgabe generiert oder kurz danach, anstatt zu warten, bis der Befehl abgeschlossen ist und dann mit seiner Ausgabe interagiert.
Alles, was ich tue, ist das Starten und Stoppen eines Dienstes. Ich mache dies durch spawn
ing des Prozesses und dann Ausgabe jeder Zeile, wie es gedruckt wird, wie folgt:
Dieser Code sollte den Dienst einfach durchlaufen: Starten Sie ihn und stoppen Sie ihn immer wieder und drucken Sie dabei die Ausgabe des Start / Stopp-Befehls. Es druckt die Ausgabe fein. Es hängt jedoch eventuell kurz vor "OUT 2". Ich kann die Ausgabe anzeigen und sehen, dass der Aufruf service
die Ausführung stoppt. Die Funktion watch
löst jedoch niemals einen EOF aus und wird beendet.
Dies geschieht nicht bei jedem Service. Einige Dienste laufen unbegrenzt. zend-server
schlägt jedoch zusammen mit einigen anderen nicht verwandten Befehlen auf die gleiche Weise periodisch fehl.
Mit "irgendwann hängt", ich meine, dass es den Dienst ein paar mal (variabel bei jedem Durchlauf) mal startet und stoppt und aufhängt. Es gähnt normalerweise nach 4-6, aber nie beim ersten Anruf - immer mindestens auf dem zweiten (daher die del
Aussage; ich dachte, ich würde auf Nummer sicher gehen).
Python 2.6.6, CentOS (64) 6.3, Pexpect 2.3-6, FWIW
Frage:
Warum hängt pexpect
an bestimmten Befehlen? Wie soll ich dieses Problem lösen?
Die Verwendung von Zeitüberschreitungen ist keine praktikable Lösung, da einige dieser Befehle wirklich beliebig lange ausgeführt werden können. service zend-server stop
ist genau das, was ich für ein Beispiel ausgewählt habe, weil es nicht so lange dauert, und ich kann es beobachten, wie es endet.
Was ich versucht habe:
Ich habe versucht, die watch
-Methode durch die folgende zu ersetzen, die expect('\n')
verwendet, aber die Ergebnisse sind die gleichen: eine variable Anzahl von Neustarts und dann ein eventuelles Hängen.
Ich kann auch pexpect.EOF
zu dem Array hinzufügen, das expect
ed zusammen mit \n
ist, und den Rückgabewert behandeln, um aus der Schleife auszubrechen, er bleibt immer noch an der gleichen Stelle hängen.