So verwenden Sie at und Batch unter Linux zum Planen von Befehlen

Wenn Sie einen Linux-Job planen möchten, der nur einmal ausgeführt wird, ist cron übertrieben. Die Befehlsfamilie at ist genau das Richtige für Sie! Und wenn Sie Prozesse nur ausführen möchten, wenn Ihr System über freie Ressourcen verfügt, können Sie Batch verwenden.

So planen Sie Linux-Jobs

Der Cron-Daemon unterhält eine Liste der Jobs, die zu bestimmten Zeiten ausgeführt werden. Diese Aufgaben und Programme werden zu den geplanten Zeiten im Hintergrund ausgeführt. Dies bietet Ihnen große Flexibilität bei der Planung von Aufgaben, die wiederholt werden müssen. Ob Sie eine Aufgabe einmal stündlich, zu einer bestimmten Uhrzeit jeden Tag oder einmal im Monat oder Jahr ausführen müssen, Sie können sie in Cron einrichten.

Dies hilft jedoch nicht, wenn Sie eine Aufgabe so planen möchten, dass sie nur einmal ausgeführt wird. Sicher, man kann es in Cron einrichten, aber dann muss man daran denken, zurückzugehen und das zu entfernen crontab-Eintrag nachdem die Aufgabe ausgeführt wurde, was unpraktisch ist.

Wenn Sie unter Linux mit einem Problem zu kämpfen haben, ist dies fast eine Garantie, dass auch jemand anderes damit zu kämpfen hat. Glücklicherweise, da es Unix-ähnliche Betriebssysteme schon so lange gibt, besteht auch eine ausgezeichnete Chance, dass jemand eine Lösung für Ihr Problem entwickelt hat.

Für das oben beschriebene Problem haben sie, und es wird aufgerufen.

Installieren des at-Befehls

Wir mussten unter Ubuntu 18.04 und Manjaro 18.1.0 installieren (es war bereits auf Fedora 31 installiert).

Um unter Ubuntu zu installieren, verwenden Sie diesen Befehl:

sudo apt-get install at

Nachdem die Installation abgeschlossen ist, können Sie den at-Daemon mit diesem Befehl starten:

sudo systemctl enable --now atd.service

Der

Auf Manjaro installieren Sie mit diesem Befehl unter:

sudo pacman -Sy at

Der

Geben Sie nach Abschluss der Installation diesen Befehl ein, um den at-Daemon zu starten:

sudo systemctl enable --now atd.service

Der

Auf jeder Distribution können Sie diesen Befehl eingeben, um sicherzustellen, dass der atd-Daemon ausgeführt wird:

ps -e | grep atd

Der

So verwenden Sie den at-Befehl interaktiv

Um es verwenden zu können, müssen Sie ihm ein Datum und eine Uhrzeit für die Ausführung zuweisen. Sie können diese sehr flexibel schreiben, auf die wir später in diesem Artikel eingehen.

Auch wenn wir at interaktiv verwenden werden, müssen Sie Datum und Uhrzeit im Voraus angeben. Wenn Sie nichts in die Befehlszeile eingeben oder etwas eingeben, das kein Datum und keine Uhrzeit ist, antwortet at mit „Unleserliche Zeit“, wie unten gezeigt:

at
at banana

Eine falsche Verwendung der

Datums- und Uhrzeitangaben können explizit oder relativ sein. Angenommen, Sie möchten, dass ein Befehl in einer Minute ausgeführt wird. at weiß, was „jetzt“ bedeutet, also können Sie jetzt verwenden und eine Minute hinzufügen, wie folgt:

at now + 1 minute

Der

at druckt eine Nachricht und eine at-Eingabeaufforderung aus und wartet darauf, dass Sie die Befehle eingeben, die Sie planen möchten. Betrachten Sie jedoch zunächst die folgende Nachricht:

Der

Es sagt Ihnen beim Start einer Instanz der sh-Shell und wird führe die Befehle darin aus. Ihre Befehle werden nicht in der Bash-Shell ausgeführt, die mit der sh-Shell kompatibel ist, aber über einen umfangreicheren Funktionsumfang verfügt.

Wenn Ihre Befehle oder Skripte versuchen, eine von Bash bereitgestellte Funktion oder Einrichtung zu verwenden, sh dies jedoch nicht tut, werden sie fehlschlagen.

Es ist einfach zu testen, ob Ihre Befehle oder Skripte in sh ausgeführt werden. Verwenden Sie den Befehl sh, um eine sh-Shell zu starten:

sh

Der

Die Eingabeaufforderung ändert sich in ein Dollarzeichen ($), und Sie können jetzt Ihre Befehle ausführen und überprüfen, ob sie richtig funktionieren.

Um zur Bash-Shell zurückzukehren, geben Sie den Exit-Befehl ein:

exit

Sie werden keine Standardausgaben oder Fehlermeldungen von den Befehlen sehen. Dies liegt daran, dass die sh-Shell als Hintergrundaufgabe gestartet wird und ohne jegliche Bildschirmoberfläche ausgeführt wird.

Jede Ausgabe der Befehle – ob gut oder schlecht – wird Ihnen per E-Mail zugesendet. Es wird über das interne Mailsystem an denjenigen gesendet, der den Befehl at ausführt. Dies bedeutet, dass Sie dieses interne E-Mail-System einrichten und konfigurieren müssen.

Viele (die meisten) Linux-Systeme haben kein internes E-Mail-System, da es selten benötigt wird. Diejenigen, die dies tun, verwenden normalerweise ein System wie sendmail oder Postfix. Wenn Ihr System kein internes E-Mail-System hat, können Sie Skripte in Dateien schreiben oder die Ausgabe in Dateien umleiten lassen, um die Protokollierung hinzuzufügen.

Wenn der Befehl keine Standardausgabe oder Fehlermeldungen generiert, erhalten Sie sowieso keine E-Mail. Viele Linux-Befehle zeigen den Erfolg durch Stille an, sodass Sie in den meisten Fällen keine E-Mail erhalten.

Jetzt ist es an der Zeit, einen Befehl einzugeben. In diesem Beispiel verwenden wir eine kleine Skriptdatei namens Sweep.sh, die die *.bak-, *.tmp- und *.o-Dateien löscht. Geben Sie den Pfad zum Befehl wie unten gezeigt ein, und drücken Sie dann die Eingabetaste.

Der

Eine weitere Eingabeaufforderung wird angezeigt, und Sie können beliebig viele Befehle hinzufügen. Es ist normalerweise bequemer, Ihre Befehle in einem einzigen Skript zu haben und dieses Skript einfach von dort aus aufzurufen.

Drücken Sie Strg+D, um anzuzeigen, dass Sie mit dem Hinzufügen von Befehlen fertig sind. bei Shows , was bedeutet Ende der Übertragung. Die Jobnummer und die geplante Ausführung des Jobs werden Ihnen wie unten gezeigt mitgeteilt:

Bestätigung von

Geben Sie nach Ausführung des Jobs Folgendes ein, um Ihre internen E-Mails zu überprüfen:

mail

Der

Kommt keine Mail, müssen Sie von Erfolg ausgehen. In diesem Fall können Sie natürlich überprüfen, ob die Dateien *.bak , *.tmp und *.o gelöscht wurden, um zu bestätigen, dass der Befehl funktioniert hat.

Geben Sie Folgendes ein, um das Ganze erneut auszuführen:

at now + 1 minute

Der

Geben Sie nach einer Minute Folgendes ein, um Ihre E-Mails erneut zu überprüfen:

mail

Der

Hey, wir haben Post! Um die erste Nachricht zu lesen, drücken Sie 1 und dann die Eingabetaste.

Wir haben eine E-Mail von at erhalten, weil die Befehle im Skript Fehlermeldungen generiert haben. In diesem Beispiel gab es keine zu löschenden Dateien, da sie bei der vorherigen Ausführung des Skripts entfernt wurden.

Drücken Sie D+Enter, um die E-Mail zu löschen und Q+Enter, um das E-Mail-Programm zu beenden.

Datums- und Zeitformate

Bei den Zeitformaten, die Sie verwenden können, sind Sie sehr flexibel. Hier einige Beispiele:

Lauf um 11:00 Uhr:

at 11:00 AM

Lauf morgen um 11:00 Uhr:

at 11:00 AM tomorrow

Lauf nächste Woche um 11:00 Uhr an diesem Tag:

at 11:00 AM next week

Ausführen zu dieser Zeit, an diesem Tag, nächste Woche:

at next week

Lauf um 11:00 Uhr nächsten Freitag:

at 11:00 AM next fri

Läuft nächsten Freitag um diese Zeit:

at next fri

Lauf um 11:00 Uhr an diesem Tag, nächsten Monat:

at 11:00 AM next month

Lauf um 11:00 Uhr an einem bestimmten Datum:

at 11:00 AM 3/15/2020

Ab jetzt 30 Minuten laufen:

at now + 30 minutes

Ab jetzt in zwei Stunden laufen:

at now + 2 hours

Führen Sie morgen um diese Zeit aus:

at tomorrow

Laufen Sie zu dieser Zeit am Donnerstag:

at thursday

Lauf um 12:00 Uhr:

at midnight

Lauf um 12:00 Uhr:

at noon

Wenn Sie ein Brite sind, können Sie sogar einen Befehl zur Teezeit (16:00 Uhr) planen:

at teatime

Blick in die Job-Warteschlange

Sie können den Befehl atq eingeben, um die Warteschlange der geplanten Jobs anzuzeigen, wie unten gezeigt.

Ausgabe von der

Für jeden Befehl in der Warteschlange zeigt atq die folgenden Informationen an:

Job-ID
Geplantes Datum
Geplante Zeit
Stellen Sie den Job in die Warteschlange. Die Warteschlangen sind mit „a“, „b“ usw. gekennzeichnet. Normale Aufgaben, die Sie mit bei planen, werden in die Warteschlange „a“ eingeordnet, während Aufgaben, die Sie mit Batch planen (weiter in diesem Artikel behandelt), in die Warteschlange „b“ gehen.
Die Person, die den Job geplant hat.

Verwenden von at in der Befehlszeile

Sie müssen at nicht interaktiv verwenden; Sie können es auch für den Befehl verwenden. Dies erleichtert die Verwendung innerhalb von Skripten.

Sie können Befehle wie folgt an at weiterleiten:

echo "sh ~/sweep.sh" | at 08:45 AM

Ein

Der Job wird von at angenommen und eingeplant, und die Jobnummer und das Ausführungsdatum werden wie zuvor gemeldet.

Verwenden von at mit Befehlsdateien

Sie können auch eine Befehlsfolge in einer Datei speichern und diese dann an at übergeben. Dies kann eine reine Textdatei mit Befehlen sein – es muss kein ausführbares Skript sein.

Sie können die Option -f (Datei) folgendermaßen verwenden, um einen Dateinamen an at zu übergeben:

at now + 5 minutes -f clean.txt

Ein

Sie können das gleiche Ergebnis erzielen, wenn Sie die Datei an folgende Adresse umleiten:

at now + 5 minutes 

Ein

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

atq
atrm 11
atq

So sehen Sie eine detaillierte Ansicht der Jobs

Wie bereits erwähnt, können Sie Jobs weit in die Zukunft planen. Manchmal vergisst du vielleicht, was ein Job tun wird. Der Befehl atq zeigt Ihnen die Jobs in der Warteschlange an, aber nicht, was sie tun werden. Wenn Sie eine Detailansicht eines Jobs anzeigen möchten, können Sie die Option -c (cat) verwenden.

Zuerst verwenden wir atq, um die Jobnummer zu finden:

atq

Ausgabe von der

Jetzt verwenden wir Jobnummer 13 mit der Option -c:

at -c 13

Der

Hier ist eine Aufschlüsselung der Informationen, die wir über den Job erhalten:

Erste Zeile: Dies sagt uns, dass die Befehle unter der sh-Shell ausgeführt werden.
Zweite Zeile: Wir sehen, dass die Befehle sowohl mit einer Benutzer- als auch mit einer Gruppen-ID von 1000 ausgeführt werden. Dies sind die Werte für die Person, die den Befehl at ausgeführt hat.
Dritte Zeile: Die Person, die alle E-Mails erhält, sendet.
Vierte Zeile: Die Benutzermaske ist 22. Dies ist die Maske, die verwendet wird, um die Standardberechtigungen für alle Dateien festzulegen, die in dieser sh-Sitzung erstellt wurden. Die Maske wird von 666 abgezogen, was uns 644 (das oktale Äquivalent von rw-r--r--) ergibt.
Restliche Daten: Der Großteil sind Umgebungsvariablen.

Ausgabe von der

Ergebnisse eines Tests. Ein Test prüft, ob auf das Ausführungsverzeichnis zugegriffen werden kann. Wenn dies nicht möglich ist, wird ein Fehler ausgegeben und die Jobausführung abgebrochen.
Die auszuführenden Befehle. Diese werden aufgelistet, und der Inhalt der geplanten Skripte wird angezeigt. Beachten Sie, dass das Skript in unserem obigen Beispiel zwar für die Ausführung unter Bash geschrieben wurde, es jedoch in einer SH-Shell ausgeführt wird.

Der Batch-Befehl

Der Batch-Befehl funktioniert ähnlich zum at-Befehl, jedoch mit drei wesentlichen Unterschieden:

Sie können den Batch-Befehl nur interaktiv verwenden.
Anstatt Jobs so zu planen, dass sie zu einem bestimmten Zeitpunkt ausgeführt werden, fügen Sie sie der Warteschlange hinzu, und der Batch-Befehl führt sie aus, wenn die durchschnittliche Auslastung des Systems unter 1,5 liegt.
Aus diesem Grund geben Sie beim Batch-Befehl niemals ein Datum und eine Uhrzeit an.

Wenn Sie den Batch-Befehl verwenden, rufen Sie ihn nach Namen ohne Befehlszeilenparameter wie folgt auf:

batch

Der

Als nächstes fügen Sie Aufgaben wie mit dem Befehl at hinzu.

Kontrollieren des Zugriffs auf das at-Kommando

Die Dateien at.allow und at.deny steuern, wer die Befehlsfamilie at verwenden kann. Diese befinden sich im Verzeichnis /etc. Standardmäßig existiert nur die Datei at.deny, die bei der Installation von at erstellt wird.

So funktionieren diese:

at.deny: Listet Anwendungen und Entitäten auf, die at nicht zum Planen von Jobs verwenden können.
at.allow: Listet auf, wer at verwenden kann, um Jobs zu planen. Wenn die Datei at.allow nicht existiert, verwendet at nur die Datei at.deny.

Standardmäßig kann jeder bei verwenden. Wenn Sie einschränken möchten, wer sie verwenden kann, verwenden Sie die Datei at.allow, um diejenigen aufzulisten, die dies tun können. Dies ist einfacher, als alle, die at nicht verwenden können, zur Datei at.deny hinzuzufügen.

So sieht die Datei at.deny aus:

sudo less /etc/at.deny

Der

Die Datei listet Komponenten des Betriebssystems auf, die nicht verwendet werden können. Viele von ihnen werden aus Sicherheitsgründen daran gehindert, sodass Sie keine aus der Datei entfernen möchten.

Jetzt bearbeiten wir die Datei at.allow. Wir werden Dave und Mary hinzufügen, aber niemand sonst darf es verwenden.

Zuerst geben wir Folgendes ein:

sudo gedit /etc/at.allow

Der

Im Editor fügen wir die beiden Namen wie unten gezeigt hinzu und speichern dann die Datei.

Wenn jemand anderes versucht, at zu verwenden, wird ihm mitgeteilt, dass er keine Erlaubnis hat. Angenommen, ein Benutzer namens Eric gibt Folgendes ein:

at

Er würde abgelehnt werden, wie unten gezeigt.

Auch hier ist eric nicht in der at.deny-Datei. Sobald Sie jemanden in die Datei at.allow einfügen, wird jedem und jedem anderen die Berechtigung zur Verwendung von at verweigert.

Ideal für Einzelstücke

Wie Sie sehen, sind sowohl at als auch Batch ideal für Aufgaben, die Sie nur einmal ausführen müssen. Nochmals als kurzer Rückblick:

Wenn Sie etwas tun müssen, das nicht regelmäßig ist, planen Sie es mit ein.
Wenn Sie eine Aufgabe nur ausführen möchten, wenn die Systemlast niedrig genug ist, verwenden Sie Batch.