Computer Hardware Forum - TweakPC

Computer Hardware Forum - TweakPC (https://www.tweakpc.de/forum/)
-   Tutorials (https://www.tweakpc.de/forum/tutorials/)
-   -   [Tutorial] [Linux] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung (https://www.tweakpc.de/forum/tutorials/52482-tutorial-linux-cron-crontab-zeitgesteuerte-befehlsausfuehrung.html)

kerri 20.10.2007 14:23

[Tutorial] [Linux] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
[size=+2]Cron - Zeitsteuerung unter Linux[/size]

Dieses Tutorial richtet sich an diejenigen unter Euch, die Linux nutzen oder betreiben, und immer wiederkehrende Aufgaben automatisiert durchfuehren moechten. Es werden Grundkenntnisse in Linux vorausgesetzt, etwa was ist eine Shell, wie ruft man Befehle in einer Shell auf und wie erzeugt und editiert man Dateien unter Linux.

[size=+1]Inhalt:[/size]
[b]Was ist cron?
Funktionsweise von cron
Syntax einer Crontab-Datei
Crontab-Verwaltung
Tipps & Tricks fuer die Crontab-Dateieintraege
Cron & Root[/b]


[size=+1]Was ist cron?[/size]

Cron ist vergleichbar mit einer Zeitschaltuhr und wird zum automatischen Starten immer wiederkehrender Aufgaben verwendet. Cron selbst wird auf den allermeisten linuxartigen Systemen automatisch mit installiert und beim Hochfahren des Rechners als Daémon gestartet. Unter Daémon versteht man einen Prozess, der im Hintergrund des Systems laeuft, und von dem man normalerweise keine Ausgabe sieht.

Ob cron auf dem eigenen System laeuft, kann man beispielsweise mit dem Befehl [code]/etc/init.d/crond status[/code] herausfinden. Erhaelt man [i]crond (pid 1234) is running...[/i] oder aehnliches als Ausgabe, laeuft cron. Ansonsten muss man dafuer sorgen, dass, falls noetig, cron nachinstalliert wird, und dass cron beim Systemstart automatisch gestartet wird.

Seine Anweisungen erhaelt cron mittels sogenannter crontab-Dateien, in denen Uhrzeiten, sowie die Programme gespeichert sind, dieausgefuehrt werden sollen. Es gibt eine systemweite Crontab-Datei unter [b][i]/etc/crontab[/i][/b] Veraenderungen an dieser Datei sollten jedoch mit absoluter Vorsicht vorgenommen werden.

[size=+1]Funktionsweise von cron[/size]

Cron liest bei seinem eigenen Start die Crontab-Dateien ein, und legt sich selbst schlafen, bis zu dem Zeitpunkt, an dem der naechste Befehl ausgefuehrt werden muss, erwacht, fuehrt den Befehl aus, und legt sich anschliessend wieder schlafen. Aenderungen, die mittels des Crontab-Verwaltungstools an den Crontab-Dateien gemacht werden, veranlassen Cron auch, diese sofort neu einzulesen.

Befehle, die cron startet, werden mit den Rechten des Users ausgefuehrt, dem die entsprechende Crontab-Datei gehoert. Produziert der ausgefuehrte Befehl Output, wird dieser dem User, dem die Cron-Tabelle gehoert, per Mail geschickt. Ist jedoch der Rechner zu dem Zeitpunkt abgeschaltet, zu dem der naechste Befehl ausgefuehrt werden muesste, wird der Befehl von Cron [b]nicht[/b] beim naechsten Rechnerstart ausgefuehrt. will man das, mus man beispielsweise auf das Tool anacron ausweichen.

Eine weitere Besonderheit stellt die Umstellung auf Sommerzeit dar. Die meisten Cron-Implementationen verhalten sich in etwa so: Wird die Systemuhr um weniger als 3 Stunden nach vorn verstellt, werden Befehle, die in dem uebersprungenen Zeitintervall liegen, sofort ausgefuehrt. Wird die Uhr um weniger als 3 Stunden nach hinten verstellt, sorgt Cron selbstaendig dafuer, dass die Befehle nicht ein zweites Mal ausgefuehrt werden. Das betrifft allerdings nur Befehle, die maximal einmal pro Stunde ausgefuehrt werden. Zeitaenderungen um mehr als 3 Stunden werden von cron allerdings nicht speziell behandelt.

Cron protokolliert ueblicherweise seine Arbeit unter [b][i]/var/log/cron[/i][/b]. Ein Blick in diese Datei koennte zum Finden eventuell auftretender Probleme recht nuetzlich sein.

Weitere Informationen finden sich auch unter [code]man cron[/code]

[size=+1]Syntax einer Crontab-Datei[/size]
Oder: Wie teilt man diesem Cron-Daémon nun eigentlich mit, wann er was zu tun hat?

Dazu erstellt man mit einem beliebigen Texteditor seiner Wahl eine einfache Textdatei (beispielsweise .crontab im Homeverzeichnis). In dieser Datei wird jeder Befehl, der ausgefuehrt werden soll, in genau einer Zeile konfiguriert. Die Zeile enthaelt dabei die folgenden 6 Felder:
[code]Minute Stunde Tag Monat Wochentag Befehl[/code]
dabei bedeuten:
[b]Minute[/b]
[indent]Die Minute, zu der das Skript ausgefuehrt werden soll. (Wertebereich: 0-59, *) [/indent][b]Stunde[/b]
[indent]Entsprechend die Stunde. (Wertebereich: 0-23, *) [/indent][b]Tag[/b]
[indent]Der Tag im Monat. (Wertebereich: 1-31, *) [/indent][b]Monat[/b]
[indent]Der Monat. Symbolische Angaben auf Englisch sind moeglich: Jan, Feb, usw., wobei Klein-/Grossschreibung egal ist. (Wertebereich: 1-12, *, symbolische Namen)[/indent][b]Wochentag[/b] [indent]Die Tage der Woche (0 (Sonntag) 6 (Sonnabend)). Der Sonntag kann auch als 7 bezeichnet werden. Hier kann symbolisch gearbeitet werden: Mon, Tue, usw., Klein-/Grossschreibung ist dabei egal. (Wertebereich: 0-7, *, symbolische Namen) [/indent][b]Befehl[/b]
[indent]Der Befehl, der ausgefuehrt werden soll. Befehle, die sich in $PATH-Verzeichnissen befinden, gehen so, ist aber ratsam, die kompletten Pfade auszuschreiben. Damit stellt man sicher, dass immer der richtige Befehl gefunden wird, statt sich darauf zu verlassen, dass $PATH richtig gesetzt ist. Moeglicher Fallstrick: Ein '%' im Befehl bedeutet ein Zeilenende; alles, was danach kommt, erhaelt der Befehl als Standardeingabe. Braucht man ein '%'-Zeichen, so ist dieses mit \ zu escapen. [/indent]
Stehen mehrere Eintraege in einem der 6 Felder, so werden die mit Komma (ohne Leerzeichen!) getrennt. Die 6 Felder selbst werden mit Leerzeichen voneinander getrennt. Ein Leerzeichen innerhalb des 6. Feldes [b]Befehl[/b] wird jedoch als Leerzeichen interpretiert.

Wenn sich unter den zeitlichen Angaben - [b]Minute[/b], [b]Stunde[/b], [b]Tag[/b], [b]Monat[/b] und [b]Wochentag[/b] - ein * befindet, wird diese Spalte ignoriert bzw. als Wildcard fuer jeden moeglichen Wert interpretiert (z.B. wenn [b]Stunde[/b] = * wird der Befehl jede Stunde ausgefuehrt).

Zusaetzlich kann man auch Zeitschritte angeben. / gefolgt von einer Zahl bezeichnet dabei eine schrittweise Angabe: [i]*/2[/i] bedeutet jeden zweiten Wert, im Feld [b]Monat[/b] also [i]2,4,6,8,10,12[/i] im Feld [b]Wochentag[/b] entsprechend [i]2,4,6[/i] (Di,Do,Sa). Ausserdem koennen Bereiche angegeben werden: 2,3,4,6 kann beispielsweise auch als [i]2-4,6[/i] geschrieben werden. Noch spezieller: [i]35-49/3[/i] liefert z.B. [i]35,38,41,44,47[/i] - kann man ja mal brauchen.....

[b]Achtung[/b]: Sind sowohl [b]Tag[/b], als auch [b]Wochentag[/b] gesetzt, werden beide durch ein logisches ODER verknuepft!

Kommentare in der crontab-Datei werden mit einem Hash-Zeichen (#) eingeleitet.

Ausserdem koennen in der Crontab-Datei Umgebungsvariablen wie $SHELL, $PATH und $HOME gesetzt werden, indem in der Crontab-Datei [i]UMGEBUNGSVARIABLE=wert[/i] oberhalb der eigentlichen Befehlsdefinitionen notiert. Als nuetzlich sie hier [i]DISPLAY=:0.[/i] erwaehnt. Damit koennen auch von Cron grafische Programme gestartet werden.

Noch ein paar Beispiele fuer Eintraege in der Crontab-Datei:
[code]
SHELL=/bin/bash

#Min Std Tag Mon WT Befehl
* * * * * echo "Jede Minute, rund um die Uhr, jeden Tag, IMMER!"
0 22 * * 6 echo "Nur Sonnabends um 22:00."
0 22 1,15 * 5 echo "Am 1. und 15. jeden Monats um 22:00, ausserdem jeden Freitag um 22:00."
0 */2 * * * echo "Alle 2 Stunden."[/code]

Lange Befehle machen Cron-Tabellen oft schnell unuebersichtlich. Daher ist es ratsam, fuer komplexere Aufgaben kleine Shell-Skripte zu erstellen, und diese dann von Cron ausfuehren zu lassen.

Weitere Informationen finden sich auch in [code]man 5 crontab[/code]

[size=+1]Crontab-Verwaltung[/size]

Wenn man nun eine Datei mit crontab-Syntax erstellt hat, weiss cron noch nichts davon. Der Befehl [code]crontab[/code] dient dem Erzeugen, Modifizieren bzw. Loeschen von Cron-Tabellen.

Cron eine bereits erstellte Crontab-Datei verfuegbar macht man mit dem Befehl [code]crontab /pfad/zur/crontabdatei[/code] Erhaelt man hier keine Rueckmeldung, ist alles glatt gelaufen, und man kann sich die eben installierte Crontab-Datei anschauen mit [code]crontab -l[/code] Erhaelt man jedoch beispielsweise die Meldung [i]You (kerri) are not allowed to use this program (crontab)[/i], hilft nur der Weg zum Sysadmin, der einen offenbar von der Benutzung von Cronjobs ausgeschlossen hat.

Eine bereits installierte eigene Cron-Tabelle editieren kann man mit dem Befehl [code]crontab -e[/code] wobei hier der Standardeditor (ueblicherweise der fuer Anfaenger schwierig zu bedienende vi) verwendet wird. [code]crontab -r[/code] loescht die Crontab-Datei.

[b]Achtung[/b]: Wenn man bereits eine Cron-Tabelle installiert hat, ueberschreibt man bei Verwendung von [code]crontab /pfad/zur/neuen/crontabdatei[/code] die alte! Dieses Problem umgeht man, indem man die vorhandene Cron-Tabelle mittels [code]crontab -e[/code] editiert, oder den Inhalt der alten Crontab-Datei in die neue uebernimmt. Das geht beispielsweise, indem man die Ausgabe von [code]crontab -l[/code] kopiert und zu den neuen Angaben hinzufuegt.

Weitere Informationen finden sich auch unter [code]man crontab[/code]

[size=+1]Tipps & Tricks fuer die Crontab-Dateieintraege[/size]

Output, der von den ausgefuehrten Befehlen produziert wird, wird dem jeweiligen Benutzer als Mail zugestellt. Will man das nicht, kann man Output unterdruecken, in dem man ans Ende des Befehls [code]> /dev/null[/code] anhaengt. Fehlermeldungen (also Dinge, die an stderr gesendet wird) werden dann immernoch per Mail an den User geschickt! Das zusaetzlich unterdruecken kann man entweder mit [code]> /dev/null 2>&1[/code] Bedeutet in etwa: den 2. Output-Kanal (also stderr) auf den 1. (stdout) umbiegen, der ja schon per [code]> /dev/null[/code] weggeworfen wird. Alternativ sollte [code]2&1>/dev/null[/code] das gleiche tun. Moeglichkeit 3, ganz anders: Will man bei keinem Crontab-Eintrag ueberhaupt niemals nicht auf keinen Fall eine Mail, kann mans unterdruecken, indem man [i]MAILTO=""[/i] an den Anfang der crontab-Datei schreibt.

[i]MAILTO="username"[/i] am Anfang der crontab-Datei schickt allen entstehenden Output per Mail an username, unabhaengig davon, wessen cronjob den Output produziert. [i]MAILTO="name@example.com"[/i] schickt die Mail mit dem Output an die entsprechend angegebene Adresse. (Voraussetzung dafuer ist allerdings, dass sendmail installiert ist und laeuft.)

[size=+1]Cron & Root[/size]

Als root kann man sich die Crontabs der User mit [code]crontab -u username -l[/code] anzeigen lassen. Alternativ liegen sie unter [b][i]/var/spool/cron/username[/i][/b], sollten da aber nicht direkt editiert werden, [code]crontab -u username -e[/code] ist hier der Befehl der Wahl.

Usern den Zugriff auf Cron verbieten kann man, indem man den User in die cron.deny-Datei eintraegt. Diese findet sich ueblicherweise unter [b][i]/etc/cron.deny[/i][/b].

In der systemweiten crontab-Datei [b][i]/etc/crontab[/i][/b] ist ein zusaetzliches Feld noetig:
[code]Minute Stunde Tag Monat Wochentag Username Befehl[/code]
[b]Username[/b] [indent]Der User, mit dessen Rechten das Skript ausgefuehrt werden soll.[/indent]Ansonsten wie gehabt.

Cron selbst wird auch verwendet, um Systemaufgaben zu erledigen. Dazu gibt es ueblicherweise 4 Verzeichnisse, [b][i]/etc/cron.hourly/[/i][/b], [b][i]/etc/cron.daily/[/i][/b], [b][i]/etc/cron.weekly/[/i][/b] und [b][i]/etc/cron.monthly/[/i][/b]. In diesen Verzeichnissen werden einfach die Skripten abgelegt bzw. verlinkt, die in entsprechenden Rhythmen durchgefuehrt werden sollen. Wann genau die Inhalte der Verzeichnisse abgearbeitet werden, ist in der Datei [b][i]/etc/crontab[/i][/b] festgelegt, die beispielsweise bei Fedora Core standardmaessig so aussieht:
[code]
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
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
[/code]

Zum einen werden da zunaechst einige Umgebungsvariablen (SHELL, PATH, MAILTO und HOME) gesetzt, anschliessend wird festgelegt, wann die Inhalte der Verzeichnisse abzuarbeiten sind: die stuendlich zu erledigenden Aufgaben jeweils eine Minute nach der vollen Stunde, die taeglichen Aufgaben um 4:02 morgens, die woechentlichen jeden Sonnabend morgens um 4:22, und die monatlich wiederkehrenden Aufgaben am 1. jeden Monats um 4:42. [code]run-parts[/code] ist dabei ein Shell-Skript, was die Inhalte der entsprechenden Verzeichnisse abarbeitet.

[url=http://www.tweakpc.de/forum/diskussionen-ueber-tutorials/52483-diskussion-cron-and-crontab-zeitgesteuerte-befehlsausfuehrung.html]Diskussion, Verbesserungsvorschlaege, etc bitte hier[/url]

Liebe Gruesse von Kerri, die sich jeden Morgen von Cron wecken laesst.

Ps.: Warum zur Hoelle wird den Dae-mon (ohne Bindestrich) versternchent? *verwundert den Kopf schuettelt*

kerri 20.10.2007 14:24

[Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
Hier geht es um das Tutorial [url=http://www.tweakpc.de/forum/tutorials/52482-tutorial-linux-cron-crontab-zeitgesteuerte-befehlsausfuehrung.html][Tutorial] [Linux] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung[/url].

Ja, ich weiss, dass das nicht allzu viele von Euch insteressieren wird, aber selbst, wenns nur fuer eine handvoll von Euch was nuetzt, bin ich gluecklich ;)

Liebe Gruesse, Kerri

Neosoul 20.10.2007 16:08

AW: [Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
Danke fürs Tut, Kerri.

Dea-mon wird bestimmt wegen den sog. Dea-mon-Tools gesperrt (natürlich ohne Bindestrich). Vermute ich jetzt zumindest mal.

MfG
Neosoul

_Smash_ 23.10.2007 22:55

AW: [Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
[quote=Neosoul;515676]
Dea-mon wird bestimmt wegen den sog. Dea-mon-Tools gesperrt (natürlich ohne Bindestrich). Vermute ich jetzt zumindest mal.[/quote]

So ist es.

Johny 24.10.2007 08:25

AW: [Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
Vielen Dank!

tele 24.10.2007 08:45

AW: [Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
Die Hand aus "handvoll" hat bereits 6 finger

kerri 24.10.2007 09:02

AW: [Diskussion] Cron & Crontab - Zeitgesteuerte Befehlsausfuehrung
 
[url=http://de.wikipedia.org/wiki/Bild:Polydactyly_01_Lhand_AP.jpg]Soll vorkommen[/url] ;)

Gruesse, Kerri


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.

Powered by vBulletin® Version 3.8.10 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.5.2 ©2010, Crawlability, Inc.