Cron: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: =CRON= ==Begriffsklärung== Der '''cron'''-Daemon ist eine Jobsteuerung von Unix bzw. unixartigen Betriebssystemen wie Linux, BSD oder Mac OS X, die wiederkehrende Auf...)
 
 
(57 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=CRON=
+
= Chronos Tabula =
==Begriffsklärung==
 
  
Der '''cron'''-Daemon ist eine Jobsteuerung von Unix bzw. unixartigen Betriebssystemen wie Linux, BSD oder Mac OS X, die wiederkehrende Aufgaben ''(cronjobs)'' automatisch zu einer bestimmten Zeit ausführen kann.
+
* Der Name leitet sich vom griechischen Wort für Zeit ab
 +
* Der Entwickler hat sich jedoch verschrieben
  
Häufig führt der Cron-Daemon wichtige Programme für die Instandhaltung des Systems aus, wie zum Beispiel Dienste für das regelmäßige Archivieren und Löschen von Logdateien.
+
[[Bild:cron-namensherkunft.png]]
  
== Crontab ==
+
* Der cron-Daemon ist eine Jobsteuerung für wiederkehrende Aufgaben, die automatisch zu einer bestimmten Zeit ausgeführt werden sollen (cronjobs).
 +
* z.B. Archivieren und Löschen von Logdateien, Erneuern von Zertifikaten, [https://www.duckdns.org/install.jsp DynDNS] oder andere Programme zur Instandhaltung des Systems
 +
* Der Cron-Daemon überwacht dazu verschiedene Dateien und Verzeichnisse, in denen Anweisungen liegen, die in regelmäßigen Abständen ausgeführt werden sollen (crontabs).
 +
* Beim Start des Daemons wird die Tabelle in den Arbeitsspeicher geladen
 +
* Es wird minütlich nach auszuführenden Jobs und Änderungen im crontab geprüft
  
Die auszuführenden Befehle werden in einer benutzereigenen Tabelle gespeichert, der sogenannten ''crontab''. Jeder Benutzer kann eine crontab erstellen. Diese Tabelle besteht aus sechs Spalten; die ersten fünf dienen der Zeitangabe (Minute, Stunde, Tag, Monat, Wochentag), alle weiteren Zeichen bis zum Zeilenumbruch werden als der auszuführende Befehl aufgefasst. Die einzelnen Spalten werden durch Leerzeichen oder Tabulatoren getrennt.
+
= Crontabs =
 
Beispiel einer ''Crontab'':
 
 
#M    S  T M W    Befehl
 
5    *  * * *    /usr/bin/message.sh
 
*/5  *  * * *    /usr/bin/message.sh
 
59    23  * * 0    cp /var/log/messages /log/backup/messages
 
0    0  * * *    cp /var/log/syslog /log/backup/syslog
 
20,30 1  * * 1-5  /usr/bin/work.sh
 
  
Der erste Befehl (beginnend mit <tt>5…</tt>) wird fünf Minuten nach jeder vollen Stunde, der zweite alle 5 Minuten (die Schrittweite wird durch <tt>*/Schrittweite</tt> angegeben), der dritte einmal pro Woche sonntags um 23:59 Uhr, der vierte täglich um 00:00 Uhr und der fünfte montags bis freitags jeweils um 01:20 und 01:30 ausgeführt. Cron bietet noch mehr Funktionen, die bei den unten genannten Weblinks eingesehen werden können.
+
* Um Syntaxfehler zu vermeiden, werden die Tabellen nicht nur mit dem Texteditor bearbeitet, sondern über den Befehl: '''crontab'''
  
Die Struktur ist wie folgt zu verstehen:
+
== User-Crontab ==
 +
 
 +
* Jeder Benutzer des Systems kann eine eigene Crontab erstellen und bearbeiten
 +
* Die Jobs, die darin aufgeführt sind, werden von Cron unter der jeweiligen Benutzerkennung ausgeführt
 +
 
 +
== Systemweiter Crontab ==
 +
 
 +
* Befindet sich unter ''/etc/crontab''
 +
* Das Format unterscheidet sich etwas von den Benutzercrontabs: es gibt eine zusätzliche Spalte für den Benutzer, unter dem der Job laufen soll
 +
 
 +
== /etc/cron.d/ ==
 +
 
 +
* Hier liegen Dateien im selben Format wie ''/etc/crontab'' – also mit Zeitfeldern und Benutzerspalte
 +
* Nützlich für Snippets, vor allem für Pakete, die eigene Jobs mitbringen
 +
 
 +
== cron.hourly, cron.daily, cron.weekly, cron.monthly ==
 +
 
 +
* '''Anderes Prinzip:''' Hier liegen keine Crontab-Zeilen, sondern '''ausführbare Skripte ohne jede Zeitangabe'''
 +
* Wann sie laufen, steht in ''/etc/crontab'' bzw. wird von ''anacron'' bestimmt
 +
* Die Datei muss ausführbar sein und darf keinen Punkt im Namen haben – ''backup.sh'' wird ignoriert, ''backup'' läuft
 +
 
 +
= Aufbau einer Crontab-Datei =
  
 
  * * * * * auszuführender Befehl
 
  * * * * * auszuführender Befehl
 
  ┬ ┬ ┬ ┬ ┬
 
  ┬ ┬ ┬ ┬ ┬
 
  │ │ │ │ │
 
  │ │ │ │ │
  │ │ │ │ └──── Wochentag (0-7) (Sonntag =0 oder =7)
+
  │ │ │ │ └──── Wochentag (0-7 oder Sun, Mon, Tue,etc) (Sonntag =0 oder =7)
  │ │ │ └────── Monat (1-12)
+
  │ │ │ └────── Monat (1-12 oder Jan, Feb, etc)
 
  │ │ └──────── Tag (1-31)
 
  │ │ └──────── Tag (1-31)
 
  │ └────────── Stunde (0-23)
 
  │ └────────── Stunde (0-23)
 
  └──────────── Minute (0-59)
 
  └──────────── Minute (0-59)
  
In vielen Linux Distributionen findet man folgende Zeilen in der crontab:
+
z.B. wöchentliches Backup der Heimatverzeichnisse aller Benutzer um 3 Uhr morgens:
 +
 
 +
0 3 * * 1 tar -zcf /var/backups/home.tgz /home/
 +
 
 +
;Achtung beim Prozentzeichen
 +
* In der Crontab bedeutet ein unmaskiertes <code>%</code> einen Zeilenumbruch – alles dahinter wird zur Standardeingabe des Befehls
 +
* Datumsformate müssen deshalb maskiert werden:
 +
0 3 * * 1 tar -zcf /var/backups/home-$(date +\%F).tgz /home/
 +
 
 +
=Beispiele=
 +
;<nowiki>*</nowiki>/2 - Dieser Eintrag führt die Aufgabe alle 2 Minuten aus.
 +
*/2 * * * * /pfad/zum/skript.sh
 +
;1,3,5,9 - Dieser Eintrag führt die Aufgabe zu bestimmten Minuten aus, nämlich 1, 3, 5 und 9.
 +
1,3,5,9 * * * * /pfad/zum/skript.sh
 +
;5-9 - Dieser Eintrag führt die Aufgabe von Minute 5 bis Minute 9 in jeder Stunde aus.
 +
5-9 * * * * /pfad/zum/skript.sh
 +
 
 +
= Die Umgebung im Cron =
 +
 
 +
* Cron startet den Job '''nicht''' in Ihrer Login-Umgebung: <code>PATH</code> ist auf <code>/usr/bin:/bin</code> beschränkt, <code>.bashrc</code> und <code>.profile</code> werden nicht gelesen
 +
* Das ist der häufigste Grund für „im Terminal geht es, im Cron nicht"
 +
* Deshalb im Job absolute Pfade verwenden oder <code>PATH</code> oben in der Crontab setzen:
 +
PATH=/usr/local/bin:/usr/bin:/bin
 +
* Zum Nachsehen, was der Job tatsächlich vorfindet:
 +
* * * * * env > /tmp/cronenv.txt
 +
 
 +
= Lief der Job? =
 +
 
 +
* Cron protokolliert jeden Start – unabhängig davon, ob der Befehl selbst funktioniert hat
 +
;Debian
 +
*journalctl -fu cron
 +
;Rocky
 +
*journalctl -u crond -f
 +
* Ausgaben des Befehls gehen per Mail an den Benutzer. Ist kein Mailsystem eingerichtet, sind sie weg – deshalb im Job umleiten:
 +
0 3 * * 1 /pfad/zum/skript.sh >> /var/log/mein-job.log 2>&1
 +
 
 +
= Verwaltung von Crontab =
 +
 
 +
== Eigene Crontab anzeigen ==
 +
 
 +
* '''crontab -l'''
 +
 
 +
== Crontab eines anderen Benutzers anzeigen ==
 +
 
 +
* '''crontab -lu ''Benutzer'''''
 +
 
 +
== Crontab bearbeiten ==
 +
 
 +
* '''crontab -e'''
 +
 
 +
== Crontab löschen ==
 +
 
 +
* '''crontab -r'''
 +
 
 +
== Crontab aus einer Datei lesen ==
 +
 
 +
* '''crontab ''/Pfad/zur/Datei'''''
 +
 
 +
= Alternative Systemd =
 +
 
 +
* Systemd-Service-Dateien haben auch eine [[Systemd Service timers|Timer]]-Funktion
 +
* Vorteile gegenüber Cron:
 +
** Sekundenauflösung statt Minute
 +
** <code>Persistent=true</code> holt verpasste Läufe nach, wenn die Maschine zur fälligen Zeit aus war
 +
** Die Ausgabe landet im Journal und ist mit <code>journalctl -u</code> abrufbar, statt per Mail verloren zu gehen
 +
** Abhängigkeiten zu anderen Units sind möglich
 +
 
 +
= Aufgaben =
 +
 
 +
== Aufgaben 1 ==
 +
 
 +
* Erstellen Sie einen Cron-Job, der jede halbe Stunde den Inhalt von /tmp nach /var/log/tmp.log schreibt.
 +
<!-- Lösung:
 +
crontab -e
 +
*/30 * * * * ls /tmp > /var/log/tmp.log
 +
-->
 +
 
 +
* Erstellen Sie einen Cron-Job, der von Montag bis Freitag um 11 Uhr die Dateien aus /bin nach /root sichert.
 +
<!-- Lösung:
 +
0 11 * * 1-5 cp -a /bin /root
 +
-->
 +
 
 +
* Erstellen Sie einen Cron-Job, der jede Minute den aktuellen Speicherverbrauch in eine Logdatei schreibt.
 +
<!-- Lösung:
 +
* * * * * free -m >> ~/speicher.log
 +
-->
 +
 
 +
* Erstellen Sie einen Cron-Job, der jeden Tag um 12 Uhr mittags eine Datei mit dem Datum im Namen anlegt. Achten Sie auf das Prozentzeichen.
 +
<!-- Lösung:
 +
0 12 * * * touch ~/datei_$(date +\%Y\%m\%d).txt
 +
-->
 +
 
 +
* Erstellen Sie einen Cron-Job, der jeden Montag um 3 Uhr morgens ein Backup Ihres Home-Verzeichnisses erstellt.
 +
<!-- Lösung:
 +
0 3 * * 1 tar -zcf ~/backup_$(date +\%Y\%m\%d).tgz ~/
 +
-->
 +
 
 +
* Prüfen Sie im Log, ob die Jobs gestartet wurden.
 +
<!-- Lösung: grep CRON /var/log/syslog bzw. journalctl -u crond -->
 +
 
 +
* Lassen Sie sich Ihre Crontab anzeigen und löschen Sie anschließend alle Jobs.
 +
<!-- Lösung: crontab -l ; crontab -r -->
 +
 
 +
== Aufgaben 2: Backup-Server mit Cron ==
 +
 
 +
* Installieren Sie nfs-common (Debian) bzw. nfs-utils (Rocky).
 +
<!-- Lösung: apt install -y nfs-common -->
 +
 
 +
* Erstellen Sie das Verzeichnis /mnt/backup.
 +
<!-- Lösung: mkdir /mnt/backup -->
 +
 
 +
* Tragen Sie die Freigabe in die /etc/fstab ein:
 +
192.168.6.200:/mnt/data /mnt/backup nfs defaults 0 0
  
# run-parts
+
* Laden Sie die Konfiguration neu, hängen Sie ein und kontrollieren Sie die Anbindung.
01 * * * * root run-parts /etc/cron.hourly
+
<!-- Lösung: systemctl daemon-reload ; mount -a ; findmnt /mnt/backup -->
02 4 * * * root run-parts /etc/cron.daily
 
22 4 * * 0 root run-parts /etc/cron.weekly
 
42 4 1 * * root run-parts /etc/cron.monthly
 
  
Die Cronjobs werden also auf spezielle Verzeichnisse, in denen die Scripte gespeichert sind, ausgelagert.
+
* Erstellen Sie in /mnt/backup ein Verzeichnis mit Ihrem Hostnamen.
Die Scripte in /etc/cron.hourly werden dann z.&nbsp;B. jede Stunde ausgeführt.
+
<!-- Lösung: mkdir /mnt/backup/$(hostname) -->
  
Ansonsten würde die Crontab unter Umständen sehr groß werden.
+
* Erstellen Sie einen Cron-Job, der stündlich Ihr /etc in dieses Verzeichnis sichert. Die Sicherung soll einen Namen in der Art '''2024-07-17-15-30-etc''' erhalten.
 +
<!-- Lösung:
 +
0 * * * * tar -zcf /mnt/backup/$(hostname)/$(date +\%Y-\%m-\%d-\%H-\%M)-etc.tgz /etc
 +
-->
  
==Optionen==
+
* Warum muss hier besonders auf das Prozentzeichen geachtet werden?
{| border=1 cellpadding=2
+
<!-- Lösung: der Dateiname besteht fast nur aus Datumsformaten. Unmaskiert bricht cron die Zeile beim ersten % ab, der Rest wird zur Standardeingabe von tar. -->
!Option
 
!Bedeutung
 
|-
 
|'''-l'''
 
|listet aktive Crontab
 
|-
 
|'''-r'''
 
|entfernt aktive Crontab
 
|-
 
|'''Datei'''
 
|setzt Inhalt der Datei als aktive Crontab
 
|-
 
|'''-u User'''
 
|bezug auf die Crontab des angebenen Users
 
|}
 
'''Crontab eines Benutzers anzeigen'''
 
root@nazgul:~# crontab -l
 

Aktuelle Version vom 27. August 2026, 12:43 Uhr

Chronos Tabula

  • Der Name leitet sich vom griechischen Wort für Zeit ab
  • Der Entwickler hat sich jedoch verschrieben

Cron-namensherkunft.png

  • Der cron-Daemon ist eine Jobsteuerung für wiederkehrende Aufgaben, die automatisch zu einer bestimmten Zeit ausgeführt werden sollen (cronjobs).
  • z.B. Archivieren und Löschen von Logdateien, Erneuern von Zertifikaten, DynDNS oder andere Programme zur Instandhaltung des Systems
  • Der Cron-Daemon überwacht dazu verschiedene Dateien und Verzeichnisse, in denen Anweisungen liegen, die in regelmäßigen Abständen ausgeführt werden sollen (crontabs).
  • Beim Start des Daemons wird die Tabelle in den Arbeitsspeicher geladen
  • Es wird minütlich nach auszuführenden Jobs und Änderungen im crontab geprüft

Crontabs

  • Um Syntaxfehler zu vermeiden, werden die Tabellen nicht nur mit dem Texteditor bearbeitet, sondern über den Befehl: crontab

User-Crontab

  • Jeder Benutzer des Systems kann eine eigene Crontab erstellen und bearbeiten
  • Die Jobs, die darin aufgeführt sind, werden von Cron unter der jeweiligen Benutzerkennung ausgeführt

Systemweiter Crontab

  • Befindet sich unter /etc/crontab
  • Das Format unterscheidet sich etwas von den Benutzercrontabs: es gibt eine zusätzliche Spalte für den Benutzer, unter dem der Job laufen soll

/etc/cron.d/

  • Hier liegen Dateien im selben Format wie /etc/crontab – also mit Zeitfeldern und Benutzerspalte
  • Nützlich für Snippets, vor allem für Pakete, die eigene Jobs mitbringen

cron.hourly, cron.daily, cron.weekly, cron.monthly

  • Anderes Prinzip: Hier liegen keine Crontab-Zeilen, sondern ausführbare Skripte ohne jede Zeitangabe
  • Wann sie laufen, steht in /etc/crontab bzw. wird von anacron bestimmt
  • Die Datei muss ausführbar sein und darf keinen Punkt im Namen haben – backup.sh wird ignoriert, backup läuft

Aufbau einer Crontab-Datei

* * * * * auszuführender Befehl
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7 oder Sun, Mon, Tue,etc) (Sonntag =0 oder =7)
│ │ │ └────── Monat (1-12 oder Jan, Feb, etc)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)

z.B. wöchentliches Backup der Heimatverzeichnisse aller Benutzer um 3 Uhr morgens:

0 3 * * 1 tar -zcf /var/backups/home.tgz /home/
Achtung beim Prozentzeichen
  • In der Crontab bedeutet ein unmaskiertes % einen Zeilenumbruch – alles dahinter wird zur Standardeingabe des Befehls
  • Datumsformate müssen deshalb maskiert werden:
0 3 * * 1 tar -zcf /var/backups/home-$(date +\%F).tgz /home/

Beispiele

*/2 - Dieser Eintrag führt die Aufgabe alle 2 Minuten aus.
*/2 * * * * /pfad/zum/skript.sh
1,3,5,9 - Dieser Eintrag führt die Aufgabe zu bestimmten Minuten aus, nämlich 1, 3, 5 und 9.
1,3,5,9 * * * * /pfad/zum/skript.sh
5-9 - Dieser Eintrag führt die Aufgabe von Minute 5 bis Minute 9 in jeder Stunde aus.
5-9 * * * * /pfad/zum/skript.sh

Die Umgebung im Cron

  • Cron startet den Job nicht in Ihrer Login-Umgebung: PATH ist auf /usr/bin:/bin beschränkt, .bashrc und .profile werden nicht gelesen
  • Das ist der häufigste Grund für „im Terminal geht es, im Cron nicht"
  • Deshalb im Job absolute Pfade verwenden oder PATH oben in der Crontab setzen:
PATH=/usr/local/bin:/usr/bin:/bin
  • Zum Nachsehen, was der Job tatsächlich vorfindet:
* * * * * env > /tmp/cronenv.txt

Lief der Job?

  • Cron protokolliert jeden Start – unabhängig davon, ob der Befehl selbst funktioniert hat
Debian
  • journalctl -fu cron
Rocky
  • journalctl -u crond -f
  • Ausgaben des Befehls gehen per Mail an den Benutzer. Ist kein Mailsystem eingerichtet, sind sie weg – deshalb im Job umleiten:
0 3 * * 1 /pfad/zum/skript.sh >> /var/log/mein-job.log 2>&1

Verwaltung von Crontab

Eigene Crontab anzeigen

  • crontab -l

Crontab eines anderen Benutzers anzeigen

  • crontab -lu Benutzer

Crontab bearbeiten

  • crontab -e

Crontab löschen

  • crontab -r

Crontab aus einer Datei lesen

  • crontab /Pfad/zur/Datei

Alternative Systemd

  • Systemd-Service-Dateien haben auch eine Timer-Funktion
  • Vorteile gegenüber Cron:
    • Sekundenauflösung statt Minute
    • Persistent=true holt verpasste Läufe nach, wenn die Maschine zur fälligen Zeit aus war
    • Die Ausgabe landet im Journal und ist mit journalctl -u abrufbar, statt per Mail verloren zu gehen
    • Abhängigkeiten zu anderen Units sind möglich

Aufgaben

Aufgaben 1

  • Erstellen Sie einen Cron-Job, der jede halbe Stunde den Inhalt von /tmp nach /var/log/tmp.log schreibt.
  • Erstellen Sie einen Cron-Job, der von Montag bis Freitag um 11 Uhr die Dateien aus /bin nach /root sichert.
  • Erstellen Sie einen Cron-Job, der jede Minute den aktuellen Speicherverbrauch in eine Logdatei schreibt.
  • Erstellen Sie einen Cron-Job, der jeden Tag um 12 Uhr mittags eine Datei mit dem Datum im Namen anlegt. Achten Sie auf das Prozentzeichen.
  • Erstellen Sie einen Cron-Job, der jeden Montag um 3 Uhr morgens ein Backup Ihres Home-Verzeichnisses erstellt.
  • Prüfen Sie im Log, ob die Jobs gestartet wurden.
  • Lassen Sie sich Ihre Crontab anzeigen und löschen Sie anschließend alle Jobs.

Aufgaben 2: Backup-Server mit Cron

  • Installieren Sie nfs-common (Debian) bzw. nfs-utils (Rocky).
  • Erstellen Sie das Verzeichnis /mnt/backup.
  • Tragen Sie die Freigabe in die /etc/fstab ein:
192.168.6.200:/mnt/data /mnt/backup nfs defaults 0 0
  • Laden Sie die Konfiguration neu, hängen Sie ein und kontrollieren Sie die Anbindung.
  • Erstellen Sie in /mnt/backup ein Verzeichnis mit Ihrem Hostnamen.
  • Erstellen Sie einen Cron-Job, der stündlich Ihr /etc in dieses Verzeichnis sichert. Die Sicherung soll einen Namen in der Art 2024-07-17-15-30-etc erhalten.
  • Warum muss hier besonders auf das Prozentzeichen geachtet werden?