Cron: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: == Cron == Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit d...)
 
 
(8 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Cron ==
{{HSDoku-Links}}
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.
=== Crontab ===
=== Crontab ===
Zeile 5: Zeile 5:


Anzeigen der aktuellen Konfiguration:
Anzeigen der aktuellen Konfiguration:
<pre>
<syntaxhighlight lang=shell>
crontab -l
crontab -l
</pre>
</syntaxhighlight>
Löschen der kompletten Konfiguration:
Löschen der kompletten Konfiguration:
<pre>
<syntaxhighlight lang=shell>
crontab -r
crontab -r
</pre>
</syntaxhighlight>
Ändern der Konfiguration:
Ändern der Konfiguration:
<pre>
<syntaxhighlight lang=shell>
crontab -e
crontab -e
</pre>
</syntaxhighlight>
Crontab von einer Datei starten:
Crontab von einer Datei starten:
<pre>
<syntaxhighlight lang=shell>
crontab myjob
crontab myjob
</pre>
</syntaxhighlight>
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:
<pre>
<syntaxhighlight lang=shell>
xyz00@hopi:~$crontab -l > myjobs
xyz00@hopi:~$crontab -l > myjobs
</pre>
</syntaxhighlight>
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:
<pre>
<syntaxhighlight lang=shell>
xyz00@hopi:~$ crontab myjobs
xyz00@hopi:~$ crontab myjobs


xyz00@hopi:~$ rm myjobs
xyz00@hopi:~$ rm myjobs
</pre>
</syntaxhighlight>
=== Dateiformat ===
=== Dateiformat ===
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:
<pre>
<syntaxhighlight lang=shell>
     * Minute (0-59)
     * Minute (0-59)
     * Stunde (0-23)
     * Stunde (0-23)
Zeile 38: Zeile 38:
     * Monat (1-12 oder JAN-DEC)
     * Monat (1-12 oder JAN-DEC)
     * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT)  
     * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT)  
</pre>
</syntaxhighlight>
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).


Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.
Umgebungsvariablen


Statt einer Zeitangabe kann auch <code>@reboot</code> verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.
=== Umgebungsvariablen ===
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:


=== Umgebungsvariable ===
<syntaxhighlight lang=ini line>
<pre>
PWD
PWD


Zeile 61: Zeile 62:


MAILTO
MAILTO
</pre>
</syntaxhighlight>
 
=== Beispiel ===
=== Beispiel ===
<pre>
<syntaxhighlight lang=shell line>
# Alle Meldungen per Mail an diesen User schicken
# Alle Meldungen per Mail an diesen User schicken
MAILTO=xyz00
MAILTO=xyz00
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden
@reboot rm -f $HOME/var/run/* && /usr/bin/monit -c "$HOME/.monitrc"


# Fuenf Minuten nach Mitternacht
# Fuenf Minuten nach Mitternacht
Zeile 81: Zeile 86:
# Jeden Freitag und jeden 1. des Monats um 4:05
# Jeden Freitag und jeden 1. des Monats um 4:05
5 4 1 * 5 echo "run at 5 after 4 every friday and every 1st"
5 4 1 * 5 echo "run at 5 after 4 every friday and every 1st"
</pre>
</syntaxhighlight>
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.
=== Performancehinweise ===
=== Performancehinweise ===


Zeile 103: Zeile 109:
----
----
[[Kategorie:HSDoku]]
[[Kategorie:HSDoku]]
[[Kategorie:Cron]]
[[Kategorie:Glossar]]
[[Kategorie:Cronjob]]
[[Kategorie:Crontab]]

Aktuelle Version vom 24. Juni 2024, 10:24 Uhr

Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.

Crontab

Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.

Anzeigen der aktuellen Konfiguration:

crontab -l

Löschen der kompletten Konfiguration:

crontab -r

Ändern der Konfiguration:

crontab -e

Crontab von einer Datei starten:

crontab myjob

Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:

xyz00@hopi:~$crontab -l > myjobs

Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:

xyz00@hopi:~$ crontab myjobs

xyz00@hopi:~$ rm myjobs

Dateiformat

Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:

    * Minute (0-59)
    * Stunde (0-23)
    * Tag des Monats (1-31)
    * Monat (1-12 oder JAN-DEC)
    * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT)

Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).

Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.

Statt einer Zeitangabe kann auch @reboot verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.

Umgebungsvariablen

Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:

PWD

LOGNAME

SHLVL

SHELL

HOME

PATH

MAILTO

Beispiel

# Alle Meldungen per Mail an diesen User schicken
MAILTO=xyz00

# bei einem Neustart des Servers soll der Monit Dienst gestartet werden
@reboot rm -f $HOME/var/run/* && /usr/bin/monit -c "$HOME/.monitrc"

# Fuenf Minuten nach Mitternacht
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

# Um 14:15 an jedem Monatsersten
15 14 1 * * $HOME/bin/monthly

# 0:23, 2:23, 4:23, 6:23 ... 22:23
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"

# Jeden Sonntag um 4:05
5 4 * * sun echo "run at 5 after 4 every sunday"

# Jeden Freitag und jeden 1. des Monats um 4:05
5 4 1 * 5 echo "run at 5 after 4 every friday and every 1st"

Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.

Performancehinweise

Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:

  • Jobs wenn möglich über Nacht laufen lassen.
  • Priorität des Jobs mit nice reduzieren.
  • Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden.

Fehlerquellen

Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.

Login-Shell: /usr/local/bin/su wird zuerst gefunden.

cron: /bin/su wird zuerst gefunden.

Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.