
Ich habe Probleme beim Senden shutdown -h 0
an einen lxc
Debian-Container (also beim Ausführen dieses Befehls im lxc) mit dem Python- pexpect
Modul (in einem Python-Skript). In diesem Modul kann der Benutzer eine bestimmte Teilzeichenfolge „erwarten“ (= auf die Ausgabe des Prozesses warten), unter anderem EOF, was mich zu der Frage führt, warum EOF in der Ausgabe nicht erkannt wird, um weiter debuggen zu können. Ich muss wissen, was ich nach Beendigung des Prozesses „erwarten“ kann, um auf das Ende des Prozesses warten zu können. Ich kann nicht einfach auf den Prozess warten, da das pexpect
Modul dafür nicht blockierende Funktionen verbirgt.
Das pexpect
Modul (siehehttp://www.bx.psu.edu/~nate/pexpect/pexpect.html#pexpect.spawn.expectfür Details) verpackt den Empfang von EOF im Lesesystemaufruf in einen (Duck-)Typ und macht ihn nutzbar in pexpect.expect
(einer Kapselung möglicher Ausgaben/Rückmeldungen eines Prozesses).
Ich habe mich gefragt, ob einige Prozesse wie ls
erwartet mit EOF enden, d. h. der pexpect
Sinn von EOF (Beispiel beihttp://pexpect.sourceforge.net/pexpect.html).
Antwort1
Anstatt diesen shutdown -h 0
Befehl auszuführen, würde ich vorschlagen, halt
stattdessen Folgendes auszuführen oder diesen Befehl vom Host aus auszuführen lxc-shutdown -n <name>
.
Antwort2
EOF bedeutet, dass keine weiteren Eingaben von einer Ressource zu erwarten sind, die möglicherweise eine endlose Menge an Daten liefert (z. B. ein Stream). Diese Situation wird häufig dadurch ausgedrückt, dass ein einzelnes Zeichen in den Stream geschrieben wird (wird vom zugrunde liegenden System definiert (wahrscheinlich ein Betriebssystem oder eine Laufzeitumgebung)).
Da Prozesse Streams für die Interprozesskommunikation verwenden, müssen sie die Grenzen ihrer Ausgabe angeben und sendende Prozesse müssen die Grenzen ihrer Eingabe mithilfe von EOF angeben. Das zugrunde liegende System wird diese Eingabe und Ausgabe mit großer Sicherheit an seine eigenen Prozessverarbeitungsmechanismen weiterleiten, sodass EOF für die Auswertung im Programm/auf dem System verfügbar ist.
Hinweis zum pexpect
Anwendungsfall in der Frage: shutil.pexpect
scheint nicht geeignet zu sein, um Dateien eines lxc
Containers zu kopieren. Es blieb hängen und der zeitliche Versatz der pexpect
Ausgabe sorgt für Verwirrung.