Ich habe den folgenden Codeblock ausgeführt (ein at
Timeout 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 at
Dienstprogramm scheint mich daran zu hindern, Bash frei zu verwenden, es sei denn, ich mache CTRL+ C. At
Auß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, at
und wie kann ich einen Zustand erreichen, in dem ich mit at weitergeleitete Befehle ausführen, Bash aber direkt danach frei verwenden kann, ohne at
die Arbeit zu unterbrechen?
Antwort1
Es hat eine Weile gedauert, bis ich Ihr eigentliches Problem erkannt habe: Sie möchten direkt einen Befehl senden, at
anstatt, 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, at
wird anschließend keine Eingabe mehr erwartet und Sie gelangen sofort zurück zur Befehlszeile.
(meine ursprüngliche Antwort bleibt hier)
Mit der Ausgabe at
haben Sie die Möglichkeit, auszuführende Befehle aufzulisten. Sie müssen angeben, at
dass 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.
at
Wenn Sie versuchen, die Ausführung apt-get purge phpmyadmin -y
in 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_UNINSTALL
erscheint 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 , bash
bis das Dokument hier vollständig gelesen wurde. Wenn bash
er 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 at
erhält ist dieAusgabevon bash
, was die Ausgabe von ist apt-get purge phpmyadmin -y
. at
Dann versucht es, diese Ausgabe zu interpretieren - nicht Ihren apt-get
Befehl, 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 -y
interaktiv in Bash auszuführen. So wie Ihr Code geschrieben ist, wird dieser Befehl vollständig ausgeführtVor at
kehrt zur Shell zurück (und at
kann vorher alles planen). Es wäre jedoch wahrscheinlich nicht sinnvoll, diesen bestimmten Code weiter zu debuggen.