Fatmawati Achmad Zaenuri/Shutterstock
Wenn Sie einen Linux-Job planen möchten, der nur einmal ausgeführt wird, cron
ist übertrieben. Das at
Befehlsfamilie ist das, was Sie brauchen! Und wenn Sie Prozesse nur ausführen möchten, wenn Ihr System über freie Ressourcen verfügt, können Sie batch
.
So planen Sie Linux-Jobs
Das cron
Dämon unterhält eine Liste der Jobs, die zu bestimmten Zeiten ausgeführt werden. Diese Aufgaben und Programme laufen zu den geplanten Zeiten im Hintergrund. Dies bietet Ihnen große Flexibilität bei der Planung von Aufgaben, die wiederholt werden müssen. Unabhängig davon, ob Sie eine Aufgabe stündlich, täglich zu einer bestimmten Uhrzeit oder einmal im Monat oder Jahr ausführen müssen, können Sie sie in it einrichten cron
.
Dies hilft jedoch nicht, wenn Sie eine Aufgabe so planen möchten, dass sie nur einmal ausgeführt wird. Klar, du kannst es einrichten in cron
, aber dann müssen Sie daran denken, zurückzugehen und die 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 heißt at
.
Installieren des at-Befehls
Wir mussten installieren at
auf Ubuntu 18.04 und Manjaro 18.1.0 (es war bereits auf Fedora 31 installiert).
Installieren at
Verwenden Sie unter Ubuntu diesen Befehl:
sudo apt-get install at

Nachdem die Installation abgeschlossen ist, können Sie die at
Dämon mit diesem Befehl:
sudo systemctl enable --now atd.service

Auf Manjaro installieren Sie at
mit diesem Befehl:
sudo pacman -Sy at

Geben Sie nach Abschluss der Installation diesen Befehl ein, um den at
Dämon:
sudo systemctl enable --now atd.service

Bei jeder Distribution können Sie diesen Befehl eingeben, um sicherzustellen, dass die atd
Daemon läuft:
ps -e | grep atd

So verwenden Sie den at-Befehl interaktiv
Benutzen at
, 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.
Aber auch wenn wir verwenden werden at
interaktiv müssen Sie Datum und Uhrzeit im Voraus angeben. Wenn Sie nichts in die Befehlszeile einfügen oder etwas eingeben, das kein Datum und keine Uhrzeit ist, at
antwortet mit „Nicht verstandene Zeit“, wie unten gezeigt:
at
at banana

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 es verwenden now
und füge eine Minute hinzu, etwa so:
at now + 1 minute

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

Es sagt dir at
startet eine Instanz des sh
Schale und Wille führe die Befehle darin aus. Ihre Befehle werden nicht in der Bash-Shell ausgeführt, die mit dem kompatibel ist sh
Shell, hat aber einen umfangreicheren Funktionsumfang.
Wenn Ihre Befehle oder Skripte versuchen, eine von Bash bereitgestellte Funktion oder Einrichtung zu verwenden, aber sh
nicht, sie werden scheitern.
Es ist einfach zu testen, ob Ihre Befehle oder Skripte in . ausgeführt werden sh
. Verwenden Sie die sh
Befehl zum Starten eines sh
Schale:
sh

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 die exit
Befehl:
exit
Sie werden keine Standardausgaben oder Fehlermeldungen von den Befehlen sehen. Dies liegt daran, dass sh
Shell startet als Hintergrundaufgabe und läuft ohne jegliche Bildschirmoberfläche.
Jede Ausgabe der Befehle – ob gut oder schlecht – wird Ihnen per E-Mail zugesendet. Es wird über das interne Mail-System an denjenigen gesendet, der die at
Befehl. 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 at
. In diesem Beispiel verwenden wir eine kleine Skriptdatei namens sweep.sh
das löscht die *.bak
, *.tmp
, und *.o
Dateien. Geben Sie den Pfad zum Befehl wie unten gezeigt ein, und drücken Sie dann die Eingabetaste.

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 innen aufzurufen at
.
Drücken Sie Strg+D, um zu sagen at
Sie sind mit dem Hinzufügen von Befehlen fertig. at
zeigt , was bedeutet Ende der Übertragung. Die Jobnummer und die geplante Ausführung des Jobs werden Ihnen wie unten gezeigt mitgeteilt:

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

Kommt keine Mail, müssen Sie von Erfolg ausgehen. In diesem Fall können Sie natürlich prüfen, ob die *.bak
, *.tmp
, und *.o
Dateien wurden gelöscht, um zu bestätigen, dass der Befehl funktioniert hat.
Geben Sie Folgendes ein, um das Ganze erneut auszuführen:
at now + 1 minute

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

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

Wir haben eine E-Mail erhalten von at
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 at
. Hier ein paar Beispiele:
- Lauf um 11:00 Uhr:
- Lauf morgen um 11:00 Uhr:
- Lauf um 11:00 Uhr an diesem Tag nächste Woche:
- Ausführen zu dieser Zeit, an diesem Tag, nächste Woche:
- Lauf um 11:00 Uhr nächsten Freitag:
- Läuft nächsten Freitag um diese Zeit:
- Lauf um 11:00 Uhr an diesem Datum, nächsten Monat:
- Lauf um 11:00 Uhr an einem bestimmten Datum:
- Ab jetzt 30 Minuten laufen:
- Ab jetzt in zwei Stunden laufen:
- Lauf morgen um diese Zeit:
- Lauf zu dieser Zeit am Donnerstag:
- Lauf um 12:00 Uhr:
- Lauf um 12:00 Uhr:
- Wenn Sie ein Brite sind, können Sie sogar einen Befehl planen, der zur Teezeit (16 Uhr) ausgeführt wird:
Blick in die Job-Warteschlange
Sie können die eingeben atq
Befehl, um die Warteschlange der geplanten Jobs anzuzeigen, wie unten gezeigt.

Für jeden Befehl in der Warteschlange atq
zeigt die folgenden Informationen an:
- Job-ID
- Geplantes Datum
- Geplante Zeit
- Stellen Sie den Job in die Warteschlange ein. Die Warteschlangen sind mit „a“, „b“ usw. gekennzeichnet. Normale Aufgaben, mit denen Sie planen
at
Gehen Sie in die Warteschlange „a“, während Aufgaben, die Sie mit planen batch
(wird später in diesem Artikel behandelt) gehen Sie in die Warteschlange „b“.
- Die Person, die den Job geplant hat.
Verwenden von at in der Befehlszeile
Sie müssen nicht verwenden at
interaktiv; Sie können es auch für den Befehl verwenden. Dies erleichtert die Verwendung innerhalb von Skripten.
Sie können Befehle in at
, so was:
echo "sh ~/sweep.sh" | at 08:45 AM

Der Auftrag wird angenommen und eingeplant von at
, und die Auftragsnummer 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 . übergeben at
. Dies kann eine reine Textdatei mit Befehlen sein – es muss kein ausführbares Skript sein.
Du kannst den … benutzen -f
(Datei) Option auf die folgende Weise, um einen Dateinamen an zu übergeben at
:
at now + 5 minutes -f clean.txt

Sie können das gleiche Ergebnis erzielen, wenn Sie die Datei in umleiten at
:
at now + 5 minutes < clean.txt

Geplante Jobs aus der Warteschlange entfernen
Um einen geplanten Job aus der Warteschlange zu entfernen, können Sie die atrm
Befehl. Wenn Sie zuerst die Warteschlange sehen möchten, um die Nummer des Jobs zu finden, den Sie entfernen möchten, können Sie verwenden atq
. Verwenden Sie dann diese Jobnummer mit atrm
, Wie nachfolgend dargestellt:
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. Das atq
Befehl zeigt Ihnen die Jobs in der Warteschlange, aber nicht, was sie tun werden. Wenn Sie eine Detailansicht eines Jobs sehen möchten, können Sie das -c
(Katze) Option.
Zuerst verwenden wir atq
um die Jobnummer zu finden:
atq

Jetzt verwenden wir die Jobnummer 13 mit dem -c
Möglichkeit:
at -c 13

Hier ist eine Aufschlüsselung der Informationen, die wir über den Job erhalten:
- Erste Linie: Dies sagt uns, dass die Befehle unter dem ausgeführt werden
sh
Schale.
- Zweite Reihe: 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 das ausgeführt hat
at
Befehl.
- Dritte Zeile: Die Person, die E-Mails erhält
at
sendet.
- Vierte Zeile: Das Benutzermaske ist 22. Dies ist die Maske, die verwendet wird, um die Standardberechtigungen für alle in diesem erstellten Dateien festzulegen
sh
Session. Die Maske wird von 666 abgezogen, was uns 644 (das oktale Äquivalent von rw-r--r--
).
- Restliche Daten: Die Mehrheit sind Umgebungsvariablen.

- 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 weiterhin in einem
sh
Schale.
Der Batch-Befehl
Das batch
Befehl funktioniert ähnlich zum at
Befehl, jedoch mit drei wesentlichen Unterschieden:
- Sie können nur die
batch
Befehl interaktiv.
- Anstatt Jobs so zu planen, dass sie zu einem bestimmten Zeitpunkt ausgeführt werden, fügen Sie sie der Warteschlange hinzu, und die
batch
Befehl führt sie aus, wenn die durchschnittliche Last des Systems niedriger als 1,5 ist.
- Aus den oben genannten Gründen geben Sie niemals ein Datum und eine Uhrzeit mit dem . an
batch
Befehl.
Wenn Sie das verwenden batch
Befehl, rufen Sie ihn mit dem Namen ohne Befehlszeilenparameter wie folgt auf:
batch

Fügen Sie als Nächstes Aufgaben hinzu, so wie Sie es mit dem at
Befehl.
Kontrollieren des Zugriffs auf das at-Kommando
Das at.allow
und at.deny
Dateien steuern, wer die at
Familie von Befehlen. Diese befinden sich innerhalb der /etc
Verzeichnis. Standardmäßig sind nur die at.deny
Datei existiert und wird erstellt, wenn at
ist installiert.
So funktionieren diese:
at.deny
: Listet Anwendungen und Entitäten auf, die nicht verwendet werden können at
Aufträge zu planen.
at.allow
: Listen, die verwenden können at
Aufträge zu planen. Wenn die at.allow
Datei existiert nicht, at
verwendet nur die at.deny
Datei.
Standardmäßig kann jeder verwenden at
. Wenn Sie einschränken möchten, wer sie verwenden kann, verwenden Sie die at.allow
Datei, um diejenigen aufzulisten, die es können. Dies ist einfacher, als alle hinzuzufügen, die nicht verwenden können at
zum at.deny
Datei.
Hier ist, was die at.deny
Datei sieht so aus:
sudo less /etc/at.deny

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

Jetzt bearbeiten wir die at.allow
Datei. Wir werden hinzufügen dave
und mary
, aber niemand sonst darf sie benutzen at
.
Zuerst geben wir Folgendes ein:
sudo gedit /etc/at.allow

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

Wenn jemand anderes versucht zu verwenden at
, 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.

Nochmal, eric
ist nicht in der at.deny
Datei. Sobald Sie jemanden in die at.allow
Datei, jeder und jedem anderen wird die Berechtigung zur Nutzung verweigert at
.
Ideal für Einzelstücke
Wie ihr seht, beides at
und batch
sind 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
at
.
- Wenn Sie eine Aufgabe nur ausführen möchten, wenn die Systemlast niedrig genug ist, verwenden Sie
batch
.