107.2 Lektion 2
Zertifikat: |
LPIC-1 |
---|---|
Version: |
5.0 |
Thema: |
107 Administrative Aufgaben |
Lernziel: |
107.2 Systemadministrationsaufgaben durch Einplanen von Jobs automatisieren |
Lektion: |
2 von 2 |
Einführung
Wie in der vorangegangenen Lektion gesehen, planen Sie mit Cron oder systemd-Timern regelmäßige Aufträge. Manchmal geht es aber um eine Aufgabe, die einmalig zu einem bestimmten Zeitpunkt in der Zukunft auszuführen ist. Hier hilft Ihnen ein anderes mächtiges Werkzeug: at
.
Jobplanung mit at
Der Befehl at
dient der Planung einmaliger Aufgaben und erfordert nur die Angabe, wann der Auftrag in der Zukunft ausgeführt werden soll. Nach der Eingabe von at
in der Befehlszeile, gefolgt von der Zeitangabe, gelangen Sie in die Eingabeaufforderung von at
, in der Sie die auszuführenden Befehle definieren. Sie verlassen die Eingabeaufforderung mit der Tastenkombination Strg+D.
$ at now +5 minutes warning: commands will be executed using /bin/sh at> date at> Ctrl+D job 12 at Sat Sep 14 09:15:00 2019
Der at
-Job im obigen Beispiel führt lediglich den Befehl date
nach fünf Minuten aus. Ähnlich wie bei cron
werden Standardausgabe und Standardfehlerausgabe per E-Mail an Sie gesendet. Beachten Sie, dass der Daemon atd
im System laufen muss, damit Sie at
für das Jobscheduling verwenden können.
Note
|
Unter Linux ist der Befehl |
Die wichtigsten Optionen für den Befehl at
sind:
-c
-
Gibt die Befehle einer bestimmten Job-ID auf der Standardausgabe aus.
-d
-
Löscht Aufträge einer Job-ID — ein Alias für
atrm
. -f
-
Liest den Auftrag aus einer Datei statt aus der Standardeingabe.
-l
-
Listet die anstehenden Aufträge des Benutzers auf. Ist der Benutzer root, werden alle Aufträge aller Benutzer aufgelistet — ein Alias für
atq
. -m
-
Sendet am Ende des Auftrags eine E-Mail an den Benutzer, auch wenn es keine Ausgabe gab.
-q
-
Gibt eine Queue in Form eines einzelnen Buchstabens von
a
bisz
und vonA
bisZ
an (standardmäßiga
fürat
undb
fürbatch
). Jobs in den Warteschlangen mit den höchsten Buchstaben werden mit höherer Priorität ausgeführt. Aufträge, die an eine Warteschlange mit einem Großbuchstaben gesendet werden, werden alsbatch
-Aufträge behandelt. -v
-
Zeigt die Zeit an, zu der der Auftrag ausgeführt wird, vor dem Lesen des Auftrags.
Geplante Aufträge mit atq
auflisten
Lassen Sie uns nun zwei weitere at
-Jobs planen: der erste führt das Skript foo.sh
um 09:30 Uhr aus, während der zweite das Skript bar.sh
nach einer Stunde ausführt.
$ at 09:30 AM warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 13 at Sat Sep 14 09:30:00 2019 $ at now +2 hours warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 14 at Sat Sep 14 11:10:00 2019
Um Ihre ausstehenden Aufträge aufzulisten, nutzen Sie den Befehl atq
, der die folgenden Informationen für jeden Auftrag anzeigt: Job-ID, Datum der Ausführung, Uhrzeit der Ausführung, Queue und Benutzername.
$ atq 14 Sat Sep 14 11:10:00 2019 a frank 13 Sat Sep 14 09:30:00 2019 a frank 12 Sat Sep 14 09:15:00 2019 a frank
Remember that the at -l
command is an alias for atq
.
Note
|
Wenn Sie |
Jobs löschen mit atrm
Um einen at
-Job zu löschen, nutzen Sie den Befehl atrm
, gefolgt von der Job-ID. Den Auftrag mit der ID 14 löschen Sie zum Beispiel wie folgt:
$ atrm 14
Sie löschen mehrere Aufträge mit atrm
, indem Sie mehrere durch Leerzeichen getrennte IDs angeben. Denken Sie daran, dass der Befehl at -d
ein Alias für atrm
ist.
Note
|
Wenn Sie |
Zugriff auf Job-Scheduling konfigurieren
Die Berechtigung für normale Benutzer, at
-Aufträge zu planen, wird durch die Dateien /etc/at.allow
und /etc/at.deny
bestimmt. Wenn /etc/at.allow
existiert, dürfen nur darin aufgeführte Nicht-Root-Benutzer at
-Aufträge planen. Wenn /etc/at.allow
nicht existiert, aber /etc/at.deny
existiert, dürfen nur darin aufgeführte Nicht-Root-Benutzer keine at
-Aufträge planen (in diesem Fall bedeutet eine leere /etc/at.deny
-Datei, dass jeder Benutzer at
-Aufträge planen darf). Wenn keine dieser Dateien vorhanden ist, hängt der Zugriff des Benutzers auf die Planung von at
-Jobs von der verwendeten Distribution ab.
Zeitangaben
Wann ein bestimmter at
-Job ausgeführt werden soll, geben Sie in der Form HH:MM
an, optional gefolgt von AM oder PM im Falle des 12-Stunden-Formats. Ist die angegebene Zeit bereits vergangen, wird der nächste Tag angenommen. Wollen Sie ein Datum festlegen, zu dem der Job ausgeführt werden soll, ergänzen Sie die Datumsangabe nach der Uhrzeit in einem der folgenden Formate: Monatsname Tag
, Monatsname Tag Jahr
, MMDDYY
, MM/DD/YYY
, DD.MM.YY
und YYYY-MM-DD
).
Die folgenden Schlüsselwörter werden ebenfalls akzeptiert: midnight
, noon
, teatime
(16 Uhr) und now
, gefolgt von einem Pluszeichen (+
) und einer Zeitspanne (Minuten, Stunden, Tage und Wochen). Schließlich können Sie at
anweisen, den Job heute oder morgen auszuführen, indem Sie der Zeit die Wörter today
oder tomorrow
folgen lassen. Zum Beispiel sorgt at 07:15 AM Jan 01
dafür, dass ein Job am 1. Januar um 07:15 Uhr ausgeführt wird, und at now +5 minutes
sorgt für die Ausführung in fünf Minuten. In der Datei timespec
unter /usr/share
finden Sie weitere Informationen zur Definition von Zeitangaben.
Eine Alternative zu at
Wenn Sie systemd als System- und Dienstmanager verwenden, können Sie einmalige Aufgaben auch mit dem Befehl systemd-run
planen. Er dient typischerweise dazu, eine temporäre Timer Unit zu erstellen, damit ein Befehl zu einer bestimmten Zeit ausgeführt wird, ohne dass dazu eine Servicedatei erstellt werden muss. Als root können Sie beispielsweise den Befehl date
am 06.10.2019 um 11:30 Uhr wie folgt ausführen:
# systemd-run --on-calendar='2019-10-06 11:30' date
Wenn Sie das Skript foo.sh
, das sich in Ihrem aktuellen Arbeitsverzeichnis befindet, nach zwei Minuten ausführen möchten, geben Sie Folgendes ein:
# systemd-run --on-active="2m" ./foo.sh
Consult the manual pages to learn all possible uses of systemd-run
with systemd-run(1)
.
Note
|
Timer werden im systemd-Journal protokolliert, so dass Sie die Protokolle der verschiedenen Units mit dem Befehl |
Geführte Übungen
-
Geben Sie für jede der folgenden Zeitangaben an, welche für
at
gültig und welche ungültig ist:at 08:30 AM next week
at midday
at 01-01-2020 07:30 PM
at 21:50 01.01.20
at now +4 days
at 10:15 PM 31/03/2021
at tomorrow 08:30 AM
-
Wie überprüfen Sie die Befehle eines Jobs, den Sie mit
at
geplant haben? -
Mit welchen Befehlen überprüfen Sie Ihre ausstehenden
at
-Jobs? Mit welchen Befehlen würden Sie diese löschen? -
Welcher Befehl ist bei systemd die Alternative zu
at
?
Offene Übungen
-
Erstellen Sie einen
at
-Job, der das Skriptfoo.sh
in Ihrem Homeverzeichnis am nächsten 31. Oktober um 10:30 Uhr ausführt. Sie arbeiten als normaler Benutzer. -
Melden Sie sich als ein anderer normaler Benutzer am System an und erstellen Sie einen weiteren
at
-Job, der das Skriptbar.sh
morgen um 10:00 Uhr ausführt. Das Skript befindet sich im Homeverzeichnis des Benutzers. -
Melden Sie sich als ein anderer normaler Benutzer am System an und erstellen Sie einen weiteren
at
-Job, der das Skriptfoobar.sh
genau nach 30 Minuten ausführt. Das Skript dazu befindet sich ebenfalls im Homeverzeichnis des Benutzers. -
Führen Sie nun als root den Befehl
atq
aus, um die geplantenat
-Jobs aller Benutzer zu überprüfen. Was passiert, wenn ein normaler Benutzer diesen Befehl ausführt? -
Löschen Sie als root alle ausstehenden
at
-Jobs mit einem einzigen Befehl. -
Führen Sie den Befehl
ls -l /usr/bin/crontab
aus. Welches spezielle Bit ist gesetzt und welche Bedeutung hat es?
Zusammenfassung
In dieser Lektion haben Sie gelernt:
-
Verwendung von
at
, um einmalige Aufträge zu einer bestimmten Zeit auszuführen. -
Verwalten von
at
-Jobs. -
Konfiguration des Benutzerzugriffs auf die
at
-Jobplanung. -
Verwendung von
systemd-run
als Alternative zuat
.
Die folgenden Befehle und Dateien wurden in dieser Lektion besprochen:
at
-
Führt Befehle zu einem bestimmten Zeitpunkt aus.
atq
-
Listet die ausstehenden
at
-Jobs des Benutzers auf, sofern der Benutzer nicht der Superuser ist. atrm
-
Löscht die per Job-ID angegebenen
at
-Jobs. /etc/at.allow
und/etc/at.deny
-
Dateien mit Definitionen von
at
-Beschränkungen. systemd-run
-
Erzeugt und startet vorübergehend eine
timer
-Einheit als Alternative zuat
für die einmalige Jobplanung.
Lösungen zu den geführten Übungen
-
Geben Sie für jede der folgenden Zeitangaben an, welche für
at
gültig und welche ungültig ist:at 08:30 AM next week
gültig
at midday
ungültig
at 01-01-2020 07:30 PM
ungültig
at 21:50 01.01.20
gültig
at now +4 days
gültig
at 10:15 PM 31/03/2021
ungültig
at tomorrow 08:30 AM monotonic
ungültig
-
Wie überprüfen Sie die Befehle eines Jobs, den Sie mit
at
geplant haben?Mit dem Befehl
at -c
, gefolgt von der Job-ID, überprüfen Sie dessen Befehle. Beachten Sie, dass die Ausgabe auch den größten Teil der Umgebung enthält, die zu dem Zeitpunkt aktiv war, als der Auftrag geplant wurde. Denken Sie daran, dass root die Aufträge aller Benutzer überprüfen kann. -
Mit welchen Befehlen überprüfen Sie Ihre ausstehenden
at
-Jobs? Mit welchen Befehlen würden Sie diese löschen?Mit dem Befehl
at -l
überprüfen Sie Ihre ausstehenden Aufträge — mitat -d
löschen Sie sie.at -l
ist ein Alias füratq
, undat -d
ist ein Alias füratrm
. Denken Sie daran, dass root die Aufträge aller Benutzer auflisten und löschen kann. -
Welcher Befehl ist bei systemd die Alternative zu
at
?Der Befehl
systemd-run
ist eine Alternative zuat
, um einmalige Jobs zu planen. Sie können damit z.B. Befehle zu einem bestimmten Zeitpunkt ausführen, indem Sie einen Calendar Timer oder einen Monotonic Timer relativ zu verschiedenen Startpunkten definieren.
Lösungen zu den offenen Übungen
-
Erstellen Sie einen
at
-Job, der das Skriptfoo.sh
in Ihrem Homeverzeichnis am nächsten 31. Oktober um 10:30 Uhr ausführt. Sie arbeiten als normaler Benutzer.$ at 10:30 AM October 31 warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 50 at Thu Oct 31 10:30:00 2019
-
Melden Sie sich als ein anderer normaler Benutzer am System an und erstellen Sie einen weiteren
at
-Job, der das Skriptbar.sh
morgen um 10:00 Uhr ausführt. Das Skript befindet sich im Homeverzeichnis des Benutzers.$ at 10:00 AM tomorrow warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 51 at Sun Oct 6 10:00:00 2019
-
Melden Sie sich als ein anderer normaler Benutzer am System an und erstellen Sie einen weiteren
at
-Job, der das Skriptfoobar.sh
genau nach 30 Minuten ausführt. Das Skript dazu befindet sich ebenfalls im Homeverzeichnis des Benutzers.$ at now +30 minutes warning: commands will be executed using /bin/sh at> ./foobar.sh at> Ctrl+D job 52 at Sat Oct 5 10:19:00 2019
-
Führen Sie nun als root den Befehl
atq
aus, um die geplantenat
-Jobs aller Benutzer zu überprüfen. Was passiert, wenn ein normaler Benutzer diesen Befehl ausführt?# atq 52 Sat Oct 5 10:19:00 2019 a dave 50 Thu Oct 31 10:30:00 2019 a frank 51 Sun Oct 6 10:00:00 2019 a emma
Wenn Sie den Befehl
atq
als root ausführen, werden alle anstehendenat
-Aufträge aller Benutzer aufgelistet. Wenn Sie ihn als normaler Benutzer ausführen, werden nur Ihre eigenen anstehendenat
-Aufträge aufgelistet. -
Löschen Sie als root alle ausstehenden
at
-Jobs mit einem einzigen Befehl.# atrm 50 51 52
-
Führen Sie als Root den Befehl
ls -l /usr/bin/at
aus und prüfen Sie die Berechtigungen.# ls -l /usr/bin/at -rwsr-sr-x 1 daemon daemon 43762 Dec 1 2015 /usr/bin/at
In dieser Distribution hat der
at
-Befehl sowohl das SUID- (dass
anstelle des Ausführungsflags für den Eigentümer) als auch das SGID-Bit (dass
anstelle des Ausführungsflags für die Gruppe) gesetzt, was bedeutet, dass er mit den Rechten des Eigentümers und der Gruppe der Datei ausgeführt wird (daemon
für beide). Aus diesem Grund können normale Benutzer Aufträge mitat
planen.