Warum hängt Pexpect nach der Ausführung bestimmter Befehle zeitweise nicht (EOF wird nicht erkannt)?

8

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:

%Vor%

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.

%Vor%     
Zac B 28.09.2012, 20:49
quelle

1 Antwort

2

Sieht nach einem Pufferproblem aus, bei dem pexpect auf mehr Daten wartet. Sie können versuchen, die Pufferung zu deaktivieren, indem Sie maxread=1 an pexpect.spawn()

übergeben     
barracel 19.11.2012 23:09
quelle

Tags und Links