Cron

Aus mxlinuxusers.de

Mit dem Dienst cron können Programme zu bestimmten wiederkehrenden Zeiten (z.B. jede Minute, jeden Tag, jede Woche oder jeden Monat) im Hintergrund (als Daemon) ausgeführt werden. Welche Programme zu welchen Zeiten ausgeführt werden sollen, wird in einer sogenannten crontab festgelegt. Jeder User kann eigene »crontabs« erzeugen, damit die Prozesse in seinem Namen (mit seinen Berechtigungen) laufen können.

Normalerweise werden Ausgaben der Programme per Mail an root bzw. den jeweiligen User gesendet, so daß es sich empfiehlt, ein Mailsystem, einen Mail Transfer Agent (MTA) wie z.B. postfix zu installieren. Dies ist aber für das funktionieren von cron nicht zwingend notwendig, sondern erleichtert nur die eventuelle Fehlersuche.

Zur Fehlersuche kann man auch die syslog durchsuchen

sudo grep CRON /var/log/syslog  # CRON tatsächlich in Grossbuchstaben!

listet alle cron betreffenden Meldungen auf. Solche Meldungen

(CRON) info (No MTA installed, discarding output)

weisen daraufhin, daß (noch) kein Mail Transfer Agent installiert wurde und die Ausgabe des Cronjobs deshalb nicht per Mail an den betreffenden User weitergeleitet werden konnte. Wie schon erwähnt, kann man dies je nach Temperament und eigenen Wünschen entweder ignorieren oder den MTA installieren. Eine weitere Möglichkeit wäre es, die Ausgaben von Skripten ganz zu unterdrücken, indem man sie nach /dev/null umleitet, z.B.

0 * * * * mybackup >/dev/null 2>&1

Dadurch werden alle Meldungen umgeleitet und "verschwinden" in /dev/null

cron setzt normalerweise voraus, daß der Rechner ununterbrochen läuft. Da dies aber bei privaten Maschinen eher selten der Fall ist, sollte zur Unterstützung zusätzlich der Dienst anacron installiert werden. anacron berücksichtigt aber nur die täglichen, wöchentlichen und monatlichen Aufgaben.

Konfigurationsdateien[Bearbeiten | Quelltext bearbeiten]

es gibt zwei Arten von Konfigurationsdateien (crontabs). Systemweite und User-spezifische crontabs.

Systemweite crontab[Bearbeiten | Quelltext bearbeiten]

Die systemweite Konfigurationsdatei crontab befindet sich in /etc/crontab

# /etc/crontab: system-wide crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

diese crontab enthält meist nur die Aufrufe von anacron und in den ersten beiden Zeilen die Festlegung, welche Shell benutzt werden soll

SHELL=/bin/sh

und in welchen Pfaden nach den Programmen/Skripten gesucht wird:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

wichtig ist eine Leerzeile am Ende von crontab, sonst wird das letzte Kommando nicht ausgeführt. Da man schlecht erkennen kann ob die Leerzeile vorhanden ist, empfiehlt sich in die letzte Zeile ein Kommentarzeichen # einzufügen.

Die eigentlich auszuführenden Aufgaben werden je nach Zeitraum in die Dateien /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly eingetragen. Dies sind aber in der Regel Aufgaben, die beim Installieren von Paketen automatisch vom Paketmanager im betreffenden Verzeichnis eingetragen werden, so daß ein normaler User damit nicht in Berührung kommt.

Benutzerspezifische crontab[Bearbeiten | Quelltext bearbeiten]

Benutzerspezifische crontabs liegen in /var/spool/cron/crontabs/ (für jeden User ein Verzeichnis mit dem Usernamen). Syntax entspricht der crontab, allerdings fehlt logischerweise der Username.

crontab editieren[Bearbeiten | Quelltext bearbeiten]

Die crontab sollte nicht direkt editiert werden, sondern nur mit dem Kommando

crontab -e 

dabei wird der in der Umgebungsvariable EDITOR bzw VISUAL definierte Editor aufgerufen (ev. vorher umdefinieren, per default wird vim benutzt).

Der benutzte Editor kann auch mit dem Kommando select-editor ausgewählt werden. Dabei werden die verfügbaren Editoren aufgelistet und es kann einer ausgewählt werden:

$ select-editor 
Select an editor.  To change later, run 'select-editor'.
 1. /bin/nano        <---- easiest
 2. /usr/bin/mcedit
 3. /usr/bin/ne
 4. /usr/bin/vim.tiny
Choose 1-4 [1]: 1

Da aber der eventuell in den Umgebungsvariablen EDITOR bzw VISUAL definierte Editor Vorrang hat, funktioniert die Variante mit select-editor nur, wenn beide Umgebungsvariablen EDITOR bzw VISUAL leer, bzw. nicht gesetzt sind. Ob dies der Fall ist, kann man sich mit echo anzeigen lassen. Erfolgt wie hier keinerlei Ausgabe, so sind diese beiden Umgebungsvariablen nicht gesetzt und es wird der mit select-editor gewählte Editor benutzt:

$ echo $EDITOR

$ echo $VISUAL

select-editor wird aber auch automatisch aufgerufen, wenn crontab zum ersten Mal editiert wird und die Umgebungsvariablen EDITOR bzw VISUAL nicht definiert sind.

crontab anzeigen[Bearbeiten | Quelltext bearbeiten]

Die eigenen angelegten cronjobs werden mit

crontab -l

angezeigt.

crontab löschen (leeren)[Bearbeiten | Quelltext bearbeiten]

Zum Löschen der gesamten crontab dient der Befehl

crontab -r

Will man versehentliches Löschen verhindern, kann man die Option -i hinzufügen, die eine Nachfrage vorausschickt:

crontab -ri
crontab: really delete user's crontab? (y/n)

Sollen nur einzelne cronjobs aus der crontab gelöscht werden, gibt es nur die Möglichkeit, dies über das Editieren zu tun:

crontab -e

und dabei die einzelne Zeile mit dem cronjob entweder ganz zu löschen oder vorsichtshalber nur mit dem Rautezeichen # am Anfang der Zeile auszukommentieren.

crontab Format[Bearbeiten | Quelltext bearbeiten]

die ersten fünf Spalten definieren den Zeitraum, innerhalb dessen die Aufgabe ausgeführt werden soll. Der Reihe nach handelt es sich um folgende Zeiten:

  • Minute (m)
  • Stunde (h)
  • Tag (dom)
  • Monat (mon)
  • Tag der Woche (dow) (0 oder 7=Sonntag, 1=Montag, usw.)

ein Stern * wird ignoriert, bzw. bedeutet "immer". Das heisst, der Stern z.B. bei den Stunden bedeutet "jede Stunde".

17 * * * * skript

heisst also, daß das Skript immer 17 Minuten nach jeder vollen Stunde ausgeführt wird.

47 6 * * 7 kommando

das Kommando wird jeden Sonntag um 06:47 ausgeführt.

für Zeitfelder sind auch Schrägstriche / (=Schrittweite), Minuszeichen - (Bereiche) und Kommata , (Aufzählungen) möglich:

*/15 * * * *	# Job wird aller 15 Minuten ausgeführt
1-59/2 * * * *	# jede ungerade Minute
5-59/20 * * * * # 5, 25, 45 Minuten nach jeder vollen Stunde
20,30 1 * * 1-5 # Ausführung jeweils um 01:20 und 01:30 von Montag bis Freitag

Da die Zeitfelder durch Leerzeichen oder Tabs getrennt werden, muss man darauf achten, daß in den Aufzählungen kein Leerzeichen vorkommt. Das obige letzte Beispiel wäre also in dieser Form

20, 30 1 * * 1 - 5

falsch (nicht erlaubtes Leerzeichen zwischen 20 und 30).

in den Zeitfeldern sind zur Erleichterung auch spezielle Schlüsselwörter möglich

@reboot   	# Ausführung einmalig beim Start 	
@daily          # Ausführung einmal pro Tag, entspricht dem crontab-Eintrag 	0 0 * * *
@midnight 	# Ausführung einmal pro Tag, entspricht dem crontab-Eintrag 	0 0 * * *
@hourly 	# Ausführung einmal pro Stunde, entspricht dem crontab-Eintrag 	0 * * * *
@weekly 	# Ausführung einmal pro Woche, entspricht dem crontab-Eintrag 	0 0 * * 0
@monthly 	# Ausführung einmal im Monat, entspricht dem crontab-Eintrag 	0 0 1 * *
@yearly         # Ausführung einmal im Jahr, entspricht dem crontab-Eintrag     0 0 1 1 *
@annually       # wie @yearly

Spalte 6 enthält das auszuführende Kommando. Nur in der /etc/crontab gibt es davor eine Spalte, in der der ausführende User eingetragen ist. Dadurch wird in diesem Spezialfall aus der Spalte 6 (Kommando) die Nr. 7

Man kann auch einen Crontab-Generator zur Erstellung der Einträge benutzen. Dort trägt man die gewünschten Zeiten und das auszuführende Kommando ein und erhält die passende Crontab-Zeile, die man nun mit Copy&Paste in die crontab eintragen kann, z.B.

1-59/2 */6 * * 3 mybackup >/dev/null 2>&1

gleichzeitig eine Auflistung, wann der betreffende Befehl ausgeführt wird:

Your cron job will be run at: (5 times displayed)
2020-04-29 00:01:00 UTC
2020-04-29 00:03:00 UTC
2020-04-29 00:05:00 UTC
2020-04-29 00:07:00 UTC
2020-04-29 00:09:00 UTC

Rechte[Bearbeiten | Quelltext bearbeiten]

ob User crontabs anlegen dürfen oder nicht, kann in den zwei Dateien /var/spool/cron/allow und /var/spool/cron/deny kontrolliert werden:

  • wenn /var/spool/cron/allow existiert, dürfen nur die hier eingetragenen User Cron-Jobs ausführen
  • wenn /var/spool/cron/deny existiert, sind die dort eingetragenen User von der Ausführung von Cron-Jobs ausgeschlossen.

Existiert keine der beiden Dateien, hängt es von der Kompilation von cron ab, ob andere User außer root Cronjobs ausführen dürfen. In MX dürfen in diesem Fall alle User ihre eigenen crontabs anlegen.

Skripte[Bearbeiten | Quelltext bearbeiten]

Da cron als Daemon im Hintergrund läuft, weiss er nichts über die Umgebungsvariablen (z.B. PATH und SHELL) des Users, und hat auch keine Verbindung zum Display oder zur Tastatur. Um zu verhindern, daß Skripte zwar beim Testen in der Userumgebung laufen, aber als cronjob scheitern, sollte man mindestens folgende Dinge beachten:

  • Es ist sehr nützlich, die gewünschte Shell und/oder den Pfad mit den schon erwähnten Zeilen in der crontab zu setzen, z.B.:
SHELL=/bin/bash
PATH=$HOME/perl5/bin:/usr/local/bin:/usr/bin:/bin
  • Eingabeaufforderungen vom User (read) können nicht benutzt werden.
  • Ausgaben (echo) sollten umgeleitet werden:
 echo "Aufgabe erledigt" >> $HOME/log.txt

ohne Umleitung wird die Ausgabe per Mail an den Besitzer des cronjobs geschickt, was aber ein installiertes Mailsystem voraussetzt. Dies hat natürlich auch Vorteile (eine Mail wird in der Regel zuverlässiger gelesen als eine Datei), so daß man dies durchaus bewusst einsetzen kann.

  • das benutzte Display ist cron nicht bekannt. Möchte man trotzdem Skripte durch cron ausführen lassen, die in irgendeiner Weise das Display "bedienen" (z.B. wechselnder Hintergrund), so kann dies durch die Angabe des Displays erfolgen:
*/30 * * * * DISPLAY=:0 feh --bg-max http://123.45.67.89/foto.jpg
# holt aller 30 Minuten von einer (hier fiktiven) Webseite die Datei foto.jpg und benutzt sie als Hintergrundbild.

GUI für cron[Bearbeiten | Quelltext bearbeiten]

Wem das alles zu kompliziert ist und/oder eine graphische Oberfläche (GUI) bevorzugt kann auch den Job Scheduler aus den MX-Werkzeugen für die Erstellung von Cron-Jobs benutzen.

Weblinks[Bearbeiten | Quelltext bearbeiten]