Warum kann ich Bash nicht frei verwenden, nachdem ich das Dienstprogramm „At“ verwendet habe? (Stdin kann erst durch Strg+C eingefügt werden)

Warum kann ich Bash nicht frei verwenden, nachdem ich das Dienstprogramm „At“ verwendet habe? (Stdin kann erst durch Strg+C eingefügt werden)

Ich habe den folgenden Codeblock ausgeführt (ein atTimeout zur Deinstallation von PHPmyadmin). Er sollte eigentlich 2 Stunden im Voraus ausgeführt werden, aber ich habe ihn mit einem Timeout von 2 Minuten ausgeführt, nur um ihn zu testen:

bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'

apt-get purge phpmyadmin -y
PMA_UNINSTALL

Das atDienstprogramm scheint mich daran zu hindern, Bash frei zu verwenden, es sei denn, ich mache CTRL+ C. AtAußerdem wird die folgende Warnung angezeigt, die normal ist und im Quellcode des Dienstprogramms fest einprogrammiert ist. Wenn ich CTRL+ mache C, verschwindet die Warnung und ich kann Bash wieder normal verwenden.

Befehle werden mit /bin/sh ausgeführt

Ich sage nicht, dass es die Warnung ist, die mich daran hindert, Bash regelmäßig zu verwenden, solange sie angezeigt wird. Ich weiß, dass die Warnung nur stdout betrifft und etwas anderes mich möglicherweise daran hindert, stdin zu erstellen.

Was hindert mich daran, eine Standardeingabe zu erstellen, mit der der obige Codeblock weitergeleitet wird, atund wie kann ich einen Zustand erreichen, in dem ich mit at weitergeleitete Befehle ausführen, Bash aber direkt danach frei verwenden kann, ohne atdie Arbeit zu unterbrechen?

Antwort1

Es hat eine Weile gedauert, bis ich Ihr eigentliches Problem erkannt habe: Sie möchten direkt einen Befehl senden, atanstatt, wie ich angenommen hatte, im Anschluss Befehle bereitzustellen.

Es ist kein kompliziertes Schema erforderlich. Geben Sie einfach

echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'

Wenn Sie es auf diese Weise tun, atwird anschließend keine Eingabe mehr erwartet und Sie gelangen sofort zurück zur Befehlszeile.


(meine ursprüngliche Antwort bleibt hier)

Mit der Ausgabe athaben Sie die Möglichkeit, auszuführende Befehle aufzulisten. Sie müssen angeben, atdass Sie fertig sind:

Drücken Sie CTRL+ D(Dies wird auch alsEnde der Übertragung)

Antwort2

TL;DR: Diese Befehle scheinen nicht das zu tun, was Sie wahrscheinlich beabsichtigen.

atWenn Sie versuchen, die Ausführung apt-get purge phpmyadmin -yin 2 Minuten durchzuführen bash, wird Ihr Code nicht das gewünschte Ergebnis erzielen.

Der Befehl links von der Pipe ( |) hat Ihr Here-Dokument als Standardeingabe. Dieser Befehl wird erst ausgeführt, wenn die Shell Ihr gesamtes Here-Dokument gelesen hat.

Aus3.6.6 Hier DokumenteimBash-Referenzhandbuch:

Diese Art der Umleitung weist die Shell an, die Eingabe aus der aktuellen Quelle zu lesen, bis eine Zeile erscheint, die nurWort(ohne abschließende Leerzeichen) wird angezeigt. Alle bis dahin gelesenen Zeilen werden dann als Standardeingabe (oder Dateideskriptor) verwendet.NWennNangegeben ist) für einen Befehl.

Ein Befehl mit einem Here-Dokument ist eigentlich nur ein einzelner Befehl, der von der Shell vollständig gelesen werden muss, bevor er ausgeführt wird. In Ihrem Code liest die Shell die Eingabebis PMA_UNINSTALLerscheint in einer eigenen Zeile. Sobald dies geschehen ist, wird die ShellDannverwendet den Inhalt des Here-Dokuments als Dateideskriptor 50 für den Befehl bash /dev/fd/50.

Dieser Befehl startet nicht einmal eine neue Instanz von , bashbis das Dokument hier vollständig gelesen wurde. Wenn basher ausgeführt wird, führt er diesen Befehl aus:

apt-get purge phpmyadmin -y

Da die ganze linke Seite des Rohreseinschließlich des hier aufgeführten Dokumentshat seine Standardausgabe weitergeleitet an at, die Eingabe aterhält ist dieAusgabevon bash, was die Ausgabe von ist apt-get purge phpmyadmin -y. atDann versucht es, diese Ausgabe zu interpretieren - nicht Ihren apt-getBefehl, sondern dessenAusgabe--als Liste der in auszuführenden Befehle /bin/sh.

Das ist also mit ziemlicher Sicherheit nicht das, was Sie vorhaben.

Ich bin mir nicht sicher, warum Sie nicht gleich nach der Eingabe dieses Codes eine Shell-Eingabeaufforderung erhalten. Wenn ich es auf einer Testmaschine ausführe, erhalte ich innerhalb weniger Sekunden eine Shell-Eingabeaufforderung zurück. Wenn Sie dies debuggen möchten, können Sie versuchen, es apt-get purge phpmyadmin -yinteraktiv in Bash auszuführen. So wie Ihr Code geschrieben ist, wird dieser Befehl vollständig ausgeführtVor atkehrt zur Shell zurück (und atkann vorher alles planen). Es wäre jedoch wahrscheinlich nicht sinnvoll, diesen bestimmten Code weiter zu debuggen.

verwandte Informationen