Der Wochenbericht, den niemand startete
Ein Laden will jeden Montag um sechs Uhr seinen Lagerbericht. Monatelang startete ihn eine Mitarbeiterin von Hand.
An einem Montag war sie krank, und der Bericht kam nicht.
Wiederkehrende Arbeit sollte eine Maschine erledigen. Sie sollte auch wichtige Programme ohne Hilfe am Laufen halten.
Am Ende dieser Lektion
Notiz
Ich kann ein Programm als Dienst betreiben und eine Aufgabe zeitlich planen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Dienst | ein Programm, das das System im Hintergrund am Laufen hält | |
| systemd | das Programm, das Dienste startet und überwacht | systemctl |
| Unit-Datei | eine kleine Datei, die systemd einen Dienst beschreibt | |
| Aktivieren | einen Dienst bei jedem Systemstart mitstarten lassen (enable) | |
| Cron | das Programm, das Aufgaben zu festen Zeiten ausführt | |
| Cron-Job | eine Zeile mit einer Zeitangabe und einem Befehl | 15 6 * * 1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
systemd betreibt Dienste
Ein Dienst ist ein Programm, das immer laufen soll, etwa ein Webserver oder ein Mailer. Unter Ubuntu startet systemd sie beim Hochfahren und überwacht sie.
Mit systemctl sprechen Sie mit systemd. Sie fragen, ob ein Dienst läuft (is-active) und ob er beim Start mitstartet (is-enabled).
Läuft der Dienst cron?
systemctl is-active cronHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Startet er beim Hochfahren?
systemctl is-enabled cronHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Alles auf einen Blick
systemctl status cron --no-pagerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Unit-Datei, die systemd für cron liest
systemctl cat cron --no-pagerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Beispiel: die Verben von systemctl
| Befehl | Wirkung | Wirkt nach einem Neustart noch? |
|---|---|---|
| systemctl start mailer | Startet ihn jetzt | Nein |
| systemctl stop mailer | Hält ihn jetzt an | Nein |
| systemctl restart mailer | Hält ihn an und startet ihn neu | Nein |
| systemctl enable mailer | Startet ihn bei jedem Hochfahren | Ja |
| systemctl disable mailer | Nimmt ihn aus dem Start heraus | Ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Unit-Datei hat drei Teile
Eine Unit-Datei ist Klartext. Eine selbst geschriebene liegt in /etc/systemd/system, eine aus einem Paket in /usr/lib/systemd/system. [Unit] beschreibt den Dienst. [Service] sagt in ExecStart, was läuft, und in Restart, ob er nach einem Fehler zurückkommt. [Install] sagt, wann er starten soll. Der nächste Block zeigt eine für ein Programm namens laden-mailer.
Eine Unit-Datei für ein anderes Programm
[Unit]
Description=Mailer des Ladens
[Service]
ExecStart=/usr/local/bin/laden-mailer
Restart=on-failure
[Install]
WantedBy=multi-user.target
Ein häufiger Fehler
Warnung
Viele glauben, systemctl start bringe einen Dienst auch nach einem Neustart zurück. Das tut es nicht. start startet ihn jetzt. enable startet ihn beim Hochfahren. Braucht ein Dienst beides, bekommt er beides.
Cron führt Befehle zu festen Zeiten aus
Eine Cron-Zeile hat fünf Zeitfelder und dann den Befehl. Die Felder sind Minute, Stunde, Tag des Monats, Monat und Wochentag.
Ein Stern * heißt jeder Wert. Eine Zahl heißt genau dieser Wert. Im Minutenfeld heißt */10 alle zehn Minuten: 0, 10, 20 und so weiter.
Ein Beispiel: Cron-Zeiten lesen
| Felder | Läuft |
|---|---|
| 15 6 * * 1 | Montags um 06:15 |
| 0 * * * * | Zu Beginn jeder Stunde |
| */10 * * * * | Alle zehn Minuten |
| 0 9 1 * * | Am Ersten jedes Monats um 09:00 |
| 30 23 * * 5 | Freitags um 23:30 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ihre eigene Liste von Jobs
crontab -lHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Zwei Beispielzeilen für Cron
# Minute Stunde Tag Monat Wochentag Nutzer Befehl
15 6 * * 1 root /usr/local/bin/wochenbericht.sh
*/10 * * * * root /usr/local/bin/lagerabgleich.sh
Der Systemordner hat ein Feld mehr
Die eigene Liste eines Nutzers, die crontab -l zeigt, hat die fünf Zeitfelder und dann den Befehl.
Eine Datei in /etc/cron.d hat zusätzlich den Nutzer, als der der Befehl läuft. Er steht zwischen Zeit und Befehl. Cron überspringt eine Datei, die ihm nicht gefällt, und auf dem Bildschirm erscheint nichts. Der Besitzer muss root sein, und niemand sonst darf hineinschreiben. Der Name darf keinen Punkt enthalten, bericht.cron wird also übersprungen. Die letzte Zeile muss mit einem Zeilenumbruch enden.
Der Systemordner für Jobs
ls -l /etc/cron.dHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Skript, das auf seinen Zeitplan wartet
cat /usr/local/bin/backup.shHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
systemd hat auch eigene Timer
systemctl list-timers --no-pagerHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Weiterführend
Im Feld für den Wochentag liest cron 1-5 als Montag bis Freitag. Schreiben Sie auf Papier die Zeile für eine Datei in /etc/cron.d, die /usr/local/bin/lagerabgleich.sh als root nur werktags um 22:45 startet.
Sagen Sie dann, wann sie als Nächstes läuft, wenn es jetzt Freitag 23:00 Uhr ist.