Ich bin ein relativer Linux-Neuling. Ich versuche zu lernen, wie man es benutzt, at
damit ich Aufgaben planen kann, die zu einem späteren Zeitpunkt beginnen, ohne sie zu benutzen sleep
. Ich habe in dieser vorherigen Frage nach Hilfe gesucht .
Meine Frage ist, warum in dem folgenden Beispiel-Bash-Skript, das ich erstellt habe, "Laufen" nie - soweit ich das beurteilen kann - auf die Standardausgabe (dh meine Bash-Konsole) gedruckt wird.
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
Die einzige Ausgabe, die ich sehe, ist zum Beispiel:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
Ist die Antwort auf meine Frage in der Warnung enthalten? Wenn ja, wie unterscheidet /bin/sh
sich die Standardausgabe?
sleep 3m; echo Running
Antworten:
Denn
at
führt keine Befehle im Kontext Ihrer angemeldeten Benutzersitzung aus. Die Idee ist, dass Sie einen Befehl so planen können, dass er zu einer beliebigen Zeit ausgeführt wird. Anschließend können Sie sich abmelden und das System kümmert sich um die Ausführung des Befehls zur angegebenen Zeit.Beachten Sie, dass die Handbuchseite für
at(1)
speziell (meine Betonung) sagt:Sie sollten also Ihren lokalen Mail-Spool oder, falls dies nicht der Fall ist, die lokalen System-Mail-Protokolle überprüfen. / var / spool / mail / $ USER ist wahrscheinlich ein guter Anfang.
Beachten Sie auch, dass "Gestartet" und "Fertiggestellt" aus dem äußeren Skript stammen und an und für sich überhaupt nichts damit zu tun haben
at
. Sie könnten sie oder denat
Aufruf herausnehmen und Sie werden im Wesentlichen das gleiche Ergebnis erhalten.quelle
Wie @ MichaelKjörling erklärt hat, werden alle von Ihrem
at
Auftrag erzeugten Ausgaben erfasst und per E-Mail an Sie gesendet. Wenn auf Ihrer Box kein MTA - Mail Transfer Agent ausgeführt wird, befindet sich die E - Mail möglicherweise in einer Schwebe, und Sie wissen nicht, dass diesat
überhaupt versucht wird.Ein MTA ist ein Programm wie
sendmail
oderpostfix
das E-Mails an ein geeignetes Ziel "zustellen" kann. In diesem Fall wird es an eine E-Mail-Warteschlange (eine Datei unter dem Verzeichnis/var/spool/mail
) auf Ihrem lokalen System gesendet. Jeder Benutzer im System kann eine Warteschlange in diesem Verzeichnis haben.Wenn ich auf meinem Fedora-System
sendmail
starte, kann die Zustellung lokaler E-Mails erfolgen. Normalerweise habe ich es aber ausgeschaltet.Jetzt können wir sehen, dass meine Mail-Warteschlange für mein Benutzerkonto
saml
leer ist:Jetzt führen wir den
at
Job aus:Wir können sehen, dass der Job darauf wartet, ausgeführt zu werden
atq
:Wenn Sie es nach ein paar Minuten erneut ausführen, sehen Sie, dass der
at
Auftrag abgeschlossen ist:Im Übrigen erhalte ich bei laufendem MTA folgende Meldung in meinem Terminal:
Also lasst uns nachsehen:
Ja, wir haben Post, also lasst es uns überprüfen mit
mutt
:Wir haben dies im "Posteingang" unserer Mail-Warteschlange:
Schauen wir uns diese E-Mail an:
Und es hat funktioniert.
quelle
Ich verwende Debian 8.1 (jessie).
Sie können den ' at' -Ausgang mit tty an ein Terminal senden.
Eine Minute später erscheint 'ZZZZZ' in Ihrem Terminal ...
quelle
Die obigen Antworten sind der Standard / "richtige" Weg, um es zu tun.
Ein weiterer Ansatz, der aus Sicht des "Endbenutzers" einfacher ist, besteht darin, dass geplante oder Hintergrundaufgaben ihre Ausgabe in eine "Protokoll" -Datei schreiben. Die Datei kann sich überall auf Ihrem System befinden, aber wenn die Aufgabe als root ausgeführt wird (von
cron
usw.), dann irgendwo darunter/var/log
ist es ein guter Ort, sie abzulegen.Ich habe das
/var/log/maint
Verzeichnis erstellt und es für alle lesbar gemacht. Unter dem Namen "backup" befindet sich eine lesbare Datei, in der ich die Ausgabe meiner Sicherungsskripte protokolliere.Ich habe mein eigenes Verzeichnis erstellt, damit meine Dateien nicht mit den vom System generierten Dingen verwechselt werden.
Um Dinge dort abzulegen (in Bash):
Das
>>
bewirkt , dass die Nachrichten an die Datei , um sie jedes Mal überschreiben , anstatt angehängt werden.Wenn mein Skript viel Ausgabe enthält, verwende ich ein Skript oder eine Funktion für die Ausgabe, damit alles auf die gleiche Weise ausgeführt wird. Hier ist meine aktuelle (Overkill-Version): (Das VERBOSE-Zeug ist da, wenn ich das Skript von einem Terminal aus starte und sehen möchte, was zu Debugging-Zwecken vor sich geht.)
Edit: Einfaches
at
Beispiel, das in eine Benutzerdatei schreibtIch habe es nicht für immer benutzt, also habe ich es mit ein paar einfachen Skripten herausgefunden.
Das erste Skript plant das Ereignis nur mit
at
. Der Befehl selbst könnte einfach in ein Terminal eingegeben werden, aber ich bin faul - insbesondere, wenn ich ihn beim Testen mehrmals ausführen muss, ohne mich mit dem Befehlsverlauf zu täuschen.Das zweite Skript ist dasjenige, dessen Ausführung geplant ist
Ich habe beide Skripte in einem Texteditor erstellt, gespeichert und sie dann jeweils mit ausführbar gemacht
chmod 700 script-file-name
. Ich habe sie der Einfachheit halber in meinem$HOME/bin
Verzeichnis abgelegt , aber sie können sich überall befinden, wo mein Benutzer uneingeschränkten Zugriff hat. Ich verwende700
jedes Skript, das nur zum Testen gedacht ist, aber auf einem Einzelnutzersystem kann es genauso gut sein755
.Ich habe bereits ein Verzeichnis aufgerufen
/home/bigbird/log
, um die Ausgabe von zu speichernmytest_at_script
. Dies kann auch sein, wo Ihr Benutzer vollen Zugriff hat. Stellen Sie einfach sicher, dass es vorhanden ist, bevor das Skript ausgeführt wird, oder lassen Sie es vom Skript erstellen.Um es auszuführen, habe ich nur sichergestellt, dass die Zeit für den
at
Befehlmytest_at_run
in der Zukunft etwas länger ist, und habe es dann von einem Terminal aus ausgeführt. Ich wartete dann bis es lief und überprüfte den Inhalt von$HOME/log/at.log
.Ein paar Anmerkungen:
Obwohl ich
at
von meinem Benutzer ausgeführt werde, kennt er meine Umgebung wie meinPATH
und mein Ausgangsverzeichnis nicht, daher gehe ich nicht davon aus. Ich benutze volle Pfade, wie ich es für jedencron
Job tun würde . Und wenn ich es jemals zu einemcron
Job machen will , muss ich nichts ändern, nur um es zum Laufen zu bringen.Früher habe ich
>>
inmytest_at_script
zu append Ausgabe in die Protokolldatei statt ,>
die es auf jedem Lauf ersetzt haben würde. Verwenden Sie das, was für Ihre Anwendung am besten geeignet ist.quelle
at
zum Schreiben in eine Datei wurde hinzugefügt . Sieht so aus, als hätten Sie in Ihrem Beispiel die Aufrufreihenfolge umgekehrt. Ich weiß nichtat
so genau , wann ich den Job ausführen soll, also habe ich in naher Zukunft eine Zeit fest programmiert.