107.2 Lektion 1
Zertifikat: |
LPIC-1 |
---|---|
Version: |
5.0 |
Thema: |
107 Administrative Aufgaben |
Lernziel: |
107.2 Systemadministrationsaufgaben durch Einplanen von Jobs automatisieren |
Lektion: |
1 von 2 |
Einführung
Eine der wichtigsten Aufgaben eines Systemadministrators ist es, Jobs zu planen, die regelmäßig ausgeführt werden müssen, z.B. Backups, Systemupgrades und viele andere. Dazu dient cron
, das sich wiederholende Aufgaben automatisiert.
Aufgaben mit Cron planen
Unter Linux ist cron
ein Daemon, der permanent läuft und jede Minute aufwacht, um einen Satz von Tabellen auf auszuführende Aufgaben zu überprüfen. Diese Tabellen heißen Crontabs und enthalten die sogenannten Cronjobs. Cron eignet sich für Server und Systeme, die ständig eingeschaltet sind, da ein Cronjob nur ausgeführt wird, wenn das System zur geplanten Zeit läuft. Es steht sowohl normalen Benutzern zur Verfügung, die jeweils ihre eigenen Crontabs haben, als auch root, der die systemweiten Crontabs verwaltet.
Note
|
Unter Linux gibt es darüber hinaus die Funktion |
Benutzer-Crontabs
User Crontabs sind Textdateien zur Planung benutzerdefinierter Cronjobs. Sie sind stets nach dem Benutzerkonto benannt, das sie erstellt, aber der Speicherort dieser Dateien ist abhängig von der verwendeten Distribution (meist ein Unterverzeichnis von /var/spool/cron
).
Jede Zeile in einem User Crontab enthält sechs durch ein Leerzeichen getrennte Felder:
-
Die Minute der Stunde (0-59)
-
Die Stunde des Tages (0-23)
-
Der Tag des Monats (1-31)
-
Der Monat des Jahres (1-12)
-
Der Wochentag (0-7 mit Sonntag=0 oder Sonntag=7)
-
Der auszuführende Befehl
Für den Monat des Jahres und den Tag der Woche können Sie die ersten drei Buchstaben des Namens anstelle der entsprechenden Zahl verwenden.
Die ersten fünf Felder geben an, wann der Befehl ausgeführt werden soll, der im sechsten Feld steht. Sie können einen oder mehrere Zeitpunkte definieren. Mehrere Zeitpunkte sind wie folgt anzugeben:
*
(Asterisk)-
Steht für alle möglichen Werte.
,
(Komma)-
Gibt eine Liste möglicher Werte an.
-
(Bindestrich)-
Gibt einen Bereich möglicher Werte an.
/
(Schrägstrich)-
Gibt gestaffelte Werte an.
Viele Distributionen enthalten die Datei /etc/crontab
als Referenz für das Layout einer cron
-Datei. Hier die /etc/crontab
-Beispieldatei einer Debian-Installation:
SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
System-Crontabs
System-Crontabs sind Textdateien zur Verwaltung systemweiter Cronjobs, die nur der Benutzer root bearbeiten kann. /etc/crontab
und alle Dateien im Verzeichnis /etc/cron.d
sind System-Crontabs.
Die meisten Distributionen enthalten auch die Verzeichnisse /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
und /etc/cron.monthly
mit Skripten, die mit der entsprechenden Frequenz ausgeführt werden sollen. Wenn Sie z.B. ein Skript täglich ausführen möchten, können Sie es in /etc/cron.daily
ablegen.
Warning
|
Einige Distributionen verwenden |
Die Syntax von System-Crontabs ähnelt der von Benutzer-Crontabs, erfordert jedoch ein zusätzliches Pflichtfeld, das angibt, welcher Benutzer den Cronjob ausführt. Daher enthält jede Zeile in einer System-Crontab sieben durch ein Leerzeichen getrennte Felder:
-
Die Minute der Stunde (0-59)
-
Die Stunde des Tages (0-23)
-
Der Tag des Monats (1-31)
-
Der Monat des Jahres (1-12)
-
Der Wochentag (0-7 mit Sonntag=0 oder Sonntag=7)
-
Der Name des Accounts, der beim Ausführen des Befehls verwendet werden soll
-
Der auszuführende Befehl
Wie bei Benutzer-Crontabs können Sie mit den Operatoren *
, ,
, -
und /
mehrere Zeitpunkte in den Zeitfeldern angeben sowie den Monat und den Wochentag mit den ersten drei Buchstaben des Namens statt der entsprechenden Zahl angeben.
Besondere Zeitangaben
In Crontab-Dateien können Sie statt der Zeitangaben auch spezielle Kürzel in den ersten fünf Spalten verwenden:
@reboot
-
Führt die angegebene Aufgabe einmal nach dem Neustart aus.
@stündlich
-
Führt die angegebene Aufgabe einmal pro Stunde zu Beginn der Stunde aus.
@daily
(oder@midnight
)-
Führt die angegebene Aufgabe einmal pro Tag um Mitternacht aus.
@weekly
-
Führt die angegebene Aufgabe einmal pro Woche am Sonntag um Mitternacht aus.
@monthly
-
Führt die angegebene Aufgabe einmal im Monat am ersten Tag des Monats um Mitternacht aus.
@yearly
(oder@annually
)-
Führt die angegebene Aufgabe einmal pro Jahr am 1. Januar um Mitternacht aus.
Crontab-Variablen
In einer crontab-Datei sind manchmal Variablenzuweisungen definiert, bevor die geplanten Aufgaben deklariert werden. Die üblicherweise gesetzten Umgebungsvariablen sind:
HOME
-
Das Verzeichnis, in dem
cron
die Befehle aufruft (standardmäßig das Homeverzeichnis des Benutzers). MAILTO
-
Der Name des Benutzers oder die Adresse, an den bzw. die die Standardausgabe und Fehler gesendet werden (standardmäßig der Besitzer der Crontab). Es sind auch mehrere kommagetrennte Werte erlaubt. Ein leerer Wert bedeutet, dass keine Mail gesendet wird.
PATH
-
Der Pfad, in dem Befehle gefunden werden.
SHELL
-
Die zu verwendende Shell (standardmäßig
/bin/sh
).
Benutzer-Cronjobs erstellen
Mit dem Befehl crontab
verwalten Sie die Crontab-Dateien einzelner Benutzer. Mit crontab -e
bearbeiten Sie Ihre eigene Crontab-Datei oder erstellen sie, falls sie noch nicht existiert:
$ crontab -e no crontab for frank - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ‑‑‑‑ easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Standardmäßig öffnet der Befehl crontab
den durch die Umgebungsvariablen VISUAL
oder EDITOR
angegebenen Editor, so dass Sie die Bearbeitung Ihrer Crontab-Datei mit dem bevorzugten Editor vornehmen können. Einige Distributionen, wie im obigen Beispiel gezeigt, erlauben die Auswahl des Editors aus einer Liste, wenn crontab
zum ersten Mal ausgeführt wird.
Wenn Sie das Skript foo.sh
, das sich in Ihrem Homeverzeichnis befindet, jeden Tag um 10:00 Uhr ausführen möchten, nehmen Sie die folgende Zeile in Ihre Crontab-Datei auf:
0 10 * * * /home/frank/foo.sh
Betrachten Sie die folgenden Crontab-Beispieleinträge:
0,15,30,45 08 * * 2 /home/frank/bar.sh 30 20 1-15 1,6 1-5 /home/frank/foobar.sh
In der ersten Zeile wird das Skript bar.sh
jeden Dienstag um 08:00 Uhr, um 08:15 Uhr, um 08:30 Uhr und um 08:45 Uhr ausgeführt. In der zweiten Zeile wird das Skript foobar.sh
um 08:30 Uhr von Montag bis Freitag für die ersten fünfzehn Tage im Januar und Juni ausgeführt.
Warning
|
Obwohl Sie Crontab-Dateien manuell bearbeiten können, ist stets der Befehl |
Neben der oben erwähnten Option -e
hat der Befehl crontab
weitere nützliche Optionen:
-l
-
Zeigt den aktuellen Crontab auf der Standardausgabe an.
-r
-
Entfernt den aktuellen Crontab.
-u
-
Gibt den Namen des Benutzers an, dessen Crontab geändert werden soll. Diese Option erfordert Root-Rechte und ermöglicht es dem Benutzer root, Benutzer-Crontab-Dateien zu bearbeiten.
System-Cronjobs erstellen
Im Gegensatz zu Benutzer-Crontabs werden System-Crontabs mit einem Editor aktualisiert. Daher müssen Sie nicht den Befehl crontab
ausführen, um /etc/crontab
und die Dateien in /etc/cron.d
zu bearbeiten. Denken Sie daran, dass Sie beim Bearbeiten von System-Crontabs das Konto angeben müssen, das für die Ausführung des Cronjobs verwendet wird (normalerweise der Benutzer root).
Wenn Sie zum Beispiel das Skript barfoo.sh
im Verzeichnis /root
jeden Tag um 01:30 Uhr ausführen möchten, öffnen Sie /etc/crontab
mit Ihrem bevorzugten Editor und fügen folgende Zeile hinzu:
30 01 * * * root /root/barfoo.sh >>/root/output.log 2>>/root/error.log
Im obigen Beispiel wird die Ausgabe des Auftrags an /root/output.log
angehängt, Fehler an /root/error.log
.
Warning
|
Sofern die Ausgabe nicht wie im obigen Beispiel in eine Datei umgeleitet wird (oder die Variable |
Zugriff auf Job-Scheduling konfigurieren
Unter Linux dienen die Dateien /etc/cron.allow
und /etc/cron.deny
dazu, Einschränkungen für crontab
zu definieren. Insbesondere können Sie hier Cronjobs für verschiedene Benutzer erlauben oder verbieten. Wenn die Datei /etc/cron.allow
existiert, können nur darin aufgeführte Nicht-Root-Benutzer Cronjobs mit dem Befehl crontab
planen. Wenn /etc/cron.deny
existiert, /etc/cron.allow
aber nicht, können Nicht-Root-Benutzer, die in dieser Datei aufgeführt sind, keine Cronjobs mit dem Befehl crontab
planen (in diesem Fall bedeutet eine leere /etc/cron.deny
, dass jeder Benutzer Cronjobs mit crontab
planen darf). Wenn keine dieser Dateien existiert, hängt der Zugriff des Benutzers auf die Planung von Cronjobs von der verwendeten Distribution ab.
Note
|
Die Dateien |
Eine Alternative zu Cron
Wenn Sie systemd als System- und Dienstmanager verwenden, steht Ihnen timers als Alternative zu cron
für die Aufgabenplanung zur Verfügung. Timers sind systemd-Unitdateien mit dem Suffix .timer
. Für jede muss es eine entsprechende Unitdatei geben, die die Unit beschreibt, die aktiviert werden soll, wenn der Timer abläuft. Standardmäßig aktiviert ein timer
einen Dienst mit demselben Namen (ohne das Suffix).
Ein Timer enthält einen Abschnitt [Timer]
, der angibt, wann geplante Aufträge ausgeführt werden sollen. Nutzen Sie die Option OnCalendar=
, um Echtzeit-Timer zu definieren, die wie Cronjobs funktionieren (sie basieren auf Ausdrücken für Kalenderereignisse). Die Option OnCalendar=
hat die folgende Syntax:
DayOfWeek Year-Month-Day Hour:Minute:Second
DayOfWeek
ist optional ist. Die Operatoren *
, /
und ,
haben die gleiche Bedeutung wie bei Cronjobs, während Sie mit ..
zwischen zwei Werten einen Bereich angeben. Für die Angabe von DayOfWeek
können Sie die ersten drei Buchstaben des Namens oder den vollständigen Namen verwenden.
Note
|
Sie können auch monotone Timer definieren, die nach Ablauf einer bestimmten Zeit ab einem bestimmten Startpunkt (z.B. beim Hochfahren des Geräts oder beim Aktivieren des Zeitgebers selbst) aktiviert werden. |
Wenn Sie z.B. den Dienst /etc/systemd/system/foobar.service
am ersten Montag jedes Monats um 05:30 Uhr ausführen möchten, fügen Sie die folgenden Zeilen in die entsprechende Unitdatei /etc/systemd/system/foobar.timer
ein:
[Unit] Description=Run the foobar service [Timer] OnCalendar=Mon *-*-1..7 05:30:00 Persistent=true [Install] WantedBy=timers.target
Sobald Sie den neuen Timer erstellt haben, können Sie ihn aktivieren und starten, indem Sie die folgenden Befehle als root ausführen:
# systemctl enable foobar.timer # systemctl start foobar.timer
Sie ändern die Frequenz Ihres geplanten Auftrags, indem Sie den Wert OnCalendar
ändern und dann den Befehl systemctl daemon-reload
ausführen.
Um die Liste der aktiven Timer, sortiert nach Ablaufzeiten, anzuzeigen, nutzen Sie den Befehl systemctl list-timers
. Mit der Option --all
fügen Sie auch die inaktiven Timer-Units hinzu.
Note
|
Denken Sie daran, dass systemd die Timer im Journal protokolliert und Sie die Protokolle der verschiedenen Units mit dem Befehl |
Statt der oben erwähnten, längeren normalisierten Form stehen einige spezielle Ausdrücke für bestimmte Häufigkeiten der Auftragsausführung bereit:
hourly
-
Führt die angegebene Aufgabe einmal pro Stunde zu Beginn der Stunde aus.
daily
-
Führt die angegebene Aufgabe einmal pro Tag um Mitternacht aus.
weekly
-
Führt die angegebene Aufgabe einmal pro Woche am Montag um Mitternacht aus.
monthly
-
Führt die angegebene Aufgabe einmal im Monat am ersten Tag des Monats um Mitternacht aus.
yearly
-
Führt die angegebene Aufgabe einmal pro Jahr am ersten Tag des Monats um Mitternacht aus.
Die vollständige Liste der Zeit- und Datumsangaben finden Sie in den Manpages unter systemd.timer(5)
.
Geführte Übungen
-
Geben Sie für jedes der folgenden Crontab-Kürzel die entsprechende Zeitangabe an (d.h. die ersten fünf Spalten in einer Benutzer-Crontab-Datei):
@hourly
@daily
@weekly
@monthly
@annually
-
Geben Sie für jedes der folgenden
OnCalendar
-Kürzel die entsprechende Zeitangabe an (die längere normalisierte Form):hourly
daily
weekly
monthly
yearly
-
Erklären Sie die Bedeutung der folgenden Zeitangaben, die in einer Crontab-Datei zu finden sind:
30 13 * * 1-5
00 09-18 * * *
30 08 1 1 *
0,20,40 11 * * Sun
00 09 10-20 1-3 *
*/20 * * * *
-
Erklären Sie die Bedeutung der folgenden Zeitangaben, die in der Option
OnCalendar
einer Timerdatei verwendet werden:*-*-* 08:30:00
Sat,Sun *-*-* 05:00:00
*-*-01 13:15,30,45:00
Fri *-09..12-* 16:20:00
Mon,Tue *-*-1,15 08:30:00
*-*-* *:00/05:00
Offene Übungen
-
Sie sind berechtigt, als normaler Benutzer Jobs mit
cron
zu planen. Mit welchem Befehl erstellen Sie Ihre eigene Crontab-Datei? -
Erstellen Sie einen einfachen geplanten Job, der den Befehl
date
jeden Freitag um 01:00 Uhr ausführt. Wo sehen Sie die Ausgabe dieses Jobs? -
Erstellen Sie einen weiteren geplanten Job, der das Skript
foobar.sh
jede Minute ausführt und die Ausgabe in die Dateioutput.log
in Ihrem Homeverzeichnis umleitet, so dass nur die Standardfehlerausgabe per E-Mail an Sie gesendet wird. -
Schauen Sie sich den Crontab-Eintrag des gerade erstellten geplanten Jobs an. Warum ist es nicht notwendig, den absoluten Pfad der Datei anzugeben, in der die Standardausgabe gespeichert wird? Und warum können Sie den Befehl
./foobar.sh
verwenden, um das Skript auszuführen? -
Bearbeiten Sie den vorherigen Crontab-Eintrag, indem Sie die Ausgabeumleitung entfernen, und deaktivieren Sie den ersten von Ihnen erstellten Cronjob.
-
Wie senden Sie die Ausgabe und Fehler Ihres geplanten Jobs per E-Mail an das Benutzerkonto
emma
? Und wie vermeiden Sie, die Standardausgabe und Fehler per E-Mail zu senden? -
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
cron
, um Jobs in regelmäßigen Abständen auszuführen. -
Verwalten von Cronjobs.
-
Konfiguration des Benutzerzugriffs auf die Planung von Cronjobs.
-
Die Rolle der systemd-Timer-Units als Alternative zu Cron.
Die folgenden Befehle und Dateien wurden in dieser Lektion besprochen:
crontab
-
Verwaltet Crontab-Dateien für einzelne Benutzer.
/etc/cron.allow
und/etc/cron.deny
-
Dateien mit Definitionen von
crontab
-Beschränkungen. /etc/crontab
-
System-Crontab-Datei.
/etc/cron.d
-
Verzeichnis der System-Crontab-Dateien.
systemctl
-
Steuert den System- und Dienstmanager systemd. In Bezug auf Timer dient er dazu, diese zu aktivieren und zu starten.
Lösungen zu den geführten Übungen
-
Geben Sie für jedes der folgenden Crontab-Kürzel die entsprechende Zeitangabe an (d.h. die ersten fünf Spalten in einer Benutzer-Crontab-Datei):
@hourly
0 * * * *
@daily
0 0 * * *
@weekly
0 0 * * 0
@monthly
0 0 1 * *
@annually
0 0 1 1 *
-
Geben Sie für jedes der folgenden
OnCalendar
-Kürzel die entsprechende Zeitangabe an (die längere normalisierte Form):hourly
*-*-* *:00:00
daily
*-*-* 00:00:00
weekly
Mon *-*-* 00:00:00
monthly
*-*-01 00:00:00
yearly
*-01-01 00:00:00
-
Erklären Sie die Bedeutung der folgenden Zeitangaben, die in einer Crontab-Datei zu finden sind:
30 13 * * 1-5
Täglich um 13:30 Uhr von Montag bis Freitag
00 09-18 * * *
Täglich und stündlich von 09 Uhr bis 18 Uhr
30 08 1 1 *
Um 08:30 Uhr am 1. Januar
0,20,40 11 * * So
Jeden Sonntag um 11:00 Uhr, 11:20 Uhr und 11:40 Uhr
00 09 10-20 1-3 *
Um 09:00 Uhr vom 10. bis 20. Januar, Februar und März
*/20 * * * *
Alle zwanzig Minuten
-
Erläutern Sie die Bedeutung der folgenden Zeitangaben, die in der Option
OnCalendar
einer Timerdatei verwendet werden:*-*-* 08:30:00
Täglich um 08:30 Uhr
Sat,Sun *-*-* 05:00:00
Um 05:00 Uhr am Samstag und Sonntag
*-*-01 13:15,30,45:00
Um 13:15, 13:30 und 13:45 Uhr am ersten Tag des Monats
Fri *-09..12-* 16:20:00
Um 16:20 Uhr jeden Freitag im September, Oktober, November und Dezember
Mon,Tue *-*-1,15 08:30:00
Um 08.30 Uhr am 1. oder 15. eines jeden Monats, wenn dieser Tag ein Montag oder Dienstag ist
*-*-* *:00/05:00
Alle fünf Minuten
Lösungen zu den offenen Übungen
-
Sie sind berechtigt, als normaler Benutzer Jobs mit
cron
zu planen. Mit welchem Befehl erstellen Sie Ihre eigene Crontab-Datei?dave@hostname ~ $ crontab -e no crontab for dave - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano < ---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.tiny Choose 1-4 [2]:
-
Erstellen Sie einen einfachen geplanten Job, der den Befehl
date
jeden Freitag um 01:00 Uhr ausführt. Wo sehen Sie die Ausgabe dieses Jobs?00 13 * * 5 date
Die Ausgabe wird per E-Mail an den Benutzer gesendet — abrufbar über den Befehl
mail
. -
Erstellen Sie einen weiteren geplanten Job, der das Skript
foobar.sh
jede Minute ausführt und die Ausgabe in die Dateioutput.log
in Ihrem Homeverzeichnis umleitet, so dass nur die Standardfehlerausgabe per E-Mail an Sie gesendet wird.*/1 * * * * ./foobar.sh >> output.log
-
Schauen Sie sich den Crontab-Eintrag des gerade erstellten geplanten Jobs an. Warum ist es nicht notwendig, den absoluten Pfad der Datei anzugeben, in der die Standardausgabe gespeichert wird? Und warum können Sie den Befehl
./foobar.sh
verwenden, um das Skript auszuführen?cron
ruft die Befehle aus dem Homeverzeichnis des Benutzers auf, es sei denn, in der Dateicrontab
ist durch die UmgebungsvariableHOME
ein anderer Ort angegeben. Aus diesem Grund können Sie den relativen Pfad der Ausgabedatei verwenden und das Skript mit./foobar.sh
ausführen. -
Bearbeiten Sie den vorherigen Crontab-Eintrag, indem Sie die Ausgabeumleitung entfernen, und deaktivieren Sie den ersten von Ihnen erstellten Cronjob.
#00 13 * * 5 date */1 * * * * ./foobar.sh
Um einen Cronjob zu deaktivieren, kommentieren Sie einfach die entsprechende Zeile in der Datei
crontab
aus. -
Wie senden Sie die Ausgabe und Fehler Ihres geplanten Jobs per E-Mail an das Benutzerkonto
emma
? Und wie vermeiden Sie, die Standardausgabe und Fehler per E-Mail zu senden?Um die Standardausgabe und Fehler an
emma
zu senden, müssen Sie die UmgebungsvariableMAILTO
in Ihrer Dateicrontab
wie folgt setzen:MAILTO="emma"
Um
cron
mitzuteilen, dass keine Mails gesendet werden sollen, weisen Sie der UmgebungsvariablenMAILTO
einen leeren Wert zu.MAILTO=""
-
Führen Sie den Befehl
ls -l /usr/bin/crontab
aus. Welches spezielle Bit ist gesetzt und welche Bedeutung hat es?$ ls -l /usr/bin/crontab -rwxr-sr-x 1 root crontab 25104 feb 10 2015 /usr/bin/crontab
Der Befehl
crontab
hat das SGID-Bit gesetzt (dass
anstelle des Ausführungsflags für die Gruppe), was bedeutet, dass er mit den Rechten der Gruppe (alsocrontab
) ausgeführt wird. Aus diesem Grund können normale Benutzer ihre Crontab-Datei mit dem Befehlcrontab
bearbeiten. Beachten Sie, dass bei vielen Distributionen die Dateiberechtigungen so eingestellt sind, dass Crontab-Dateien nur über den Befehlcrontab
bearbeitet werden können.