Schreiben alle Linux-Prozesse EOF in die Standardausgabe, wenn sie beendet werden/mit der Beendigung fertig sind?

Schreiben alle Linux-Prozesse EOF in die Standardausgabe, wenn sie beendet werden/mit der Beendigung fertig sind?

Ich habe Probleme beim Senden shutdown -h 0an einen lxcDebian-Container (also beim Ausführen dieses Befehls im lxc) mit dem Python- pexpectModul (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 pexpectModul dafür nicht blockierende Funktionen verbirgt.

Das pexpectModul (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 lserwartet mit EOF enden, d. h. der pexpectSinn von EOF (Beispiel beihttp://pexpect.sourceforge.net/pexpect.html).

Antwort1

Anstatt diesen shutdown -h 0Befehl auszuführen, würde ich vorschlagen, haltstattdessen Folgendes auszuführen oder diesen Befehl vom Host aus auszuführen lxc-shutdown -n <name>.

Quelle:9.5 Überwachen und Herunterfahren von Containern

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 pexpectAnwendungsfall in der Frage: shutil.pexpectscheint nicht geeignet zu sein, um Dateien eines lxcContainers zu kopieren. Es blieb hängen und der zeitliche Versatz der pexpectAusgabe sorgt für Verwirrung.

verwandte Informationen