Kurz-HowTo: Cronjobs

Lesenswerte Artikel, Anleitungen und Diskussionen
static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Kurz-HowTo: Cronjobs

Post by static » 2003-09-16 20:33

Hi,
nachdem ich das Gefühl habe, dass Cronjobs oft nicht richtig verstanden werden und immer wieder das Gleiche gefragt wird, habe ich mich entschlossen ein kurzes HowTo dazu zu schreiben... Ich arbeite mit einem Debian System, es dürfte aber nur geringe Abweichungen zu anderen Distributionen geben. Ergänzungen, Korrekturen und Tipps sind natürlich gern gesehen ;-)

1. Was ist ein Cronjob / Welche Möglichkeiten habe ich mit Cronjobs?

Cronjobs sind Skripte oder Aufgaben, die zu einem bestimmten Zeitpunkt vom System ausgeführt werden sollen. Das System eignet sich deshalb besonders gut für Aufgaben die immer wieder anstehen und die kein Eingreifen des Users verlangen (Bspw. Backups, Logs auswerten oder Trafficinformationen verschicken). Cronjobs sind ungefähr das Selbe wie die "Geplanten Tasks" unter Windows :roll:

2. Wie erstelle ich Cronjobs

Die einfachste Möglichkeit vorweg - wem das bereits genügt braucht den Rest nicht mehr zu lesen:
Wenn man ein Script jeden Tag ausführen will, kopiert man es einfach in den Ordner /etc/cron.daily, für einmal pro Woche in /etc/cron.weekly und einmal pro Monat in /etc/cron.monthly und das war's bereits. (Auf die Rechte achten 'chmod 700 script.sh'!)

Wem das nicht genügt hat zwei verschiedene Möglichkeiten Cronjobs einzutragen. Einerseits in die Datei /etc/crontab, die aber nur vom User root geändert werden kann oder mit dem Befehl 'crontab -e'. Zuerst die Möglichkeit über die Datei /etc/crontab. Das Format eines neuen Crontabs sieht folgendermassen aus:

3. Wie muss ein Cronjob aussehen?

Code: Select all

Minute | Stunde | Tag des Monats | Monat | Tag der Woche | User | Befehl
Die möglichen Werte aufgelistet:
Minute: 0-59
Stunde: 0-23
Tag des Monats: 1-31
Monat: 1-12
Tag der Woche: Nützlich wenn z.B. immer Dienstags ein Script gestartet werden soll. Möglich ist 0-7, wobei 0 und 7 jeweils der Sonntag ist.
User: Der Benutzername unter dem das Script ausgeführt werden soll. Bspw root
Befehl: Konsolen-Befehl oder Scriptname der ausgeführt wird. Bspw /root/scripts/backup.sh

Wie sieht ein solcher Aufruf nun komplett aus?

Code: Select all

0 15 * * *   root    /root/scripts/backup.sh
Das Script /root/scripts/backup.sh würde nun jeden Tag um 15 Uhr ausgeführt.
Wie man hier sieht werden die Werte die egal sind mit einem Stern (*) gekennzeichnet, in diesem Fall ist es egal was für ein Tag ist, in welchem Monat wir uns befinden und auch ob wir Dienstag oder Donnerstag haben ;-)

Ã?ber den Befehl crontab -e funktioniert das ganz ähnlich, es fällt nur die Spalte User weg, da das Script unter dem Benutzer laufen wird, der den Cronjob eingerichtet hat.
Bsp:

Code: Select all

0 15 * * *   /root/scripts/backup.sh
Nun hat man aber noch einige weitere Möglichkeiten die Werte anzugeben:

Listen: Mit , getrennte Werte (ohne Abstand dazwischen) Bspw: 8,12 um ein Script um 8 und 12 Uhr auszuführen.
Zahlenfolgen: Mit - getrennte Werte Bspw. 8-12 um das Script um 8,9,10,11 und 12 Uhr auszuführen.
Stufen: */Stufe, Wird genutzt um z.B.: "alle fünf Minuten" oder "jeden 2. Tag" zu erstellen. Bspw: */2 um das Script alle zwei Stunden auszuführen.

4. Besondere Aufrufe

Für besondere Ereignisse kann man anstatt der 5 Zeitdaten eines der Folgenden einsetzen:

@reboot Ausführen beim Systemstart
@yearly Einmal pro Jahr
@monthly Einmal pro Monat
@weekly Einmal pro Woche
@daily Einmal am Tag
@hourly Einmal pro Stunde

Bsp:

Code: Select all

@reboot		root		/root/scripts/backup.sh
Führt das Script beim Systemstart unter dem User root aus.

5. Output und Fehlermeldungen

Schreibt man in die /etc/crontab eine Zeile wie

Code: Select all

MAILTO=root
Wird die gesamte Ausgabe der Scripts per Mail an den User root gesendet.
Wenn man dies bei keinem seiner Scripte will, löscht man einfach die Zeile mit dem MAILTO= aus /etc/crontab.
Will man nur bei bestimmten Scripts keine Meldung fügt man > /dev/null an den Aufruf an, damit werden die Meldungen die vom Script gesendet werden ins Nichts geleitet ;-)

Beispiel:

Code: Select all

0 15 * * *   root    /root/scripts/backup.sh > /dev/null
Nun erhält man aber noch allfällige Fehlermeldungen per Mail. Will man auch diese nicht, muss noch 2>&1 angefügt werden, damit werden Fehler dorthin geleitet wo auch die Normale Ausgabe hinkommt, und das ist wieder ins Nichts...

Beispiel:

Code: Select all

0 15 * * *   root    /root/scripts/backup.sh > /dev/null 2>&1
6. Beispiele

Um das Ganze noch etwas verständlicher zu machen einige Beispiele:

Code: Select all

* * * * *	root	/root/scripts/backup.sh
Script wird jede Minute ausgeführt.

Code: Select all

*/1 * * * *	root	/root/scripts/backup.sh
Bewirkt das Selbe wie der Aufruf oben.

Code: Select all

10 * * * *		root	/root/scripts/backup.sh
Script wird jede Stunde um 10 nach ausgeführt. (14.10, 15.10 etc)

Code: Select all

0 10,12 * * *	root	/root/scripts/backup.sh
Script wird jeden Tag um 10.00 und 12.00 Uhr ausgeführt.

Code: Select all

0 0 2-4 * *	root	/root/scripts/backup.sh
Script wird am 2., 3. und 4. jeden Monats um 0.00 Uhr ausgeführt.

Code: Select all

40,50 13 */2  4-8 *	root	/root/scripts/backup.sh > /dev/null 2>&1
Script wird vom April bis August jeden zweiten Tag um 13.40 und 13.50 ausgeführt, wobei die Ausgabe wie auch die Fehlermeldungen nicht verschickt werden.

Code: Select all

*/2 * * * *	root	/root/scripts/backup.sh > /dev/null
Script wird alle 2 Minuten aufgerufen wobei der Output des Scripts nicht verschickt wird.

Code: Select all

0 10 * * 1	root	/root/scripts/backup.sh
Script wird jeden Montag um 10.00 Uhr ausgeführt.


Ich hoffe das Ganze ist halbwegs verständlich rübergekommen ;)

so long
static

captaincrunch
Userprojekt
Userprojekt
Posts: 7225
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Kurz-HowTo: Cronjobs

Post by captaincrunch » 2003-09-16 20:45

Hey cool ! Ganz heißen Dank für das Howto.

Ich verschiebe den Thread aber mal ins Newbie, weil die Fragen bzgl. Crontabs fast ausschließlich da auftauchen, und ich denke, dass dort mehr Bedarf daran besteht.
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

cfreak
Posts: 74
Joined: 2002-08-12 19:51
Location: Regensburg

Re: Kurz-HowTo: Cronjobs

Post by cfreak » 2003-09-16 21:06

*jetzt fehlt ein smilie mit nem riesigem daumen nach oben*

gut gemacht, nur leider bezweifele ich das leute deinen thead lesen bevor sie ihre fragen hier posten..

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-09-16 21:11

cfreak202 wrote:[...]nur leider bezweifele ich das leute deinen thead lesen bevor sie ihre fragen hier posten..
ich auch :?
Aber vielleicht reicht bei einigen ein Link um ein wenig Selbstinitiative hervorzurufen :wink:

net-master
Posts: 25
Joined: 2003-09-20 10:37

Re: Kurz-HowTo: Cronjobs

Post by net-master » 2003-09-21 15:10

thx das hat mir geholfen wuste vorher noch nicht alles über crontabs(:

boozedǃ
Posts: 47
Joined: 2003-09-27 14:55
Location: /root

Re: Kurz-HowTo: Cronjobs

Post by boozedǃ » 2003-09-30 16:48

Super gemacht. :wink:

kevin_poulsen
Posts: 43
Joined: 2003-09-24 14:53

Re: Kurz-HowTo: Cronjobs

Post by kevin_poulsen » 2003-10-02 12:17

gibts ne möglichkeit cronjobs öfter als alle minute auszuführen?

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-10-02 12:41

Hi,
direkt über crontab AFAIK nicht, aber vielleicht mit diesem etwas riskanten Workaround: du könntest in deinem Script welches jede Minute ausgeführt wird am Ende z.b. ein "sleep 30" anfügen und dann das eigentliche Script nochmals... Ka, ob das eine so gute Idee ist, aber vielleicht hilft es dir ja :roll:

so long
static

kevin_poulsen
Posts: 43
Joined: 2003-09-24 14:53

Re: Kurz-HowTo: Cronjobs

Post by kevin_poulsen » 2003-10-02 13:03

wird der cronjob neu gestartet, wenn er noch laeuft (z.b. wenn er gerade noch ne mail zieht)?

rossi
Posts: 20
Joined: 2003-09-21 09:04
Location: Burghausen / Bayern

Re: Kurz-HowTo: Cronjobs

Post by rossi » 2003-10-09 08:31

Hi,
thanks für die kleine einführung. Genau das was ich gesucht habe. Wäre es noch möglich ein kleines Beispielscript zu posten. Hab leider noch keine richtige vorstellung wie so etwas aussieht. Ich würde z.b. gerne einmal die woche den Inhalt eines Ordners mit tar packen und dann auf den Backup-ftp putten. Kann man sowas automatisieren und wenn ja, wie sieht so ein script.sh dann in etwa aus?

gruß,
newbie rossi

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-10-09 13:55

@Rossi: n bisschen suchen hätte dir z.B. diesen Link gebracht:

http://www.rootforum.org/forum/viewtopic ... tar+backup

so long
static

z00m
Posts: 5
Joined: 2003-11-13 18:37

Re: Kurz-HowTo: Cronjobs

Post by z00m » 2003-12-14 19:27

hallo,

habe dazu nochmal eine frage:

<<<Wenn man ein Script jeden Tag ausführen will, kopiert man es einfach in den Ordner /etc/cron.daily, für einmal pro Woche in /etc/cron.weekly und einmal pro Monat in /etc/cron.monthly und das war's bereits>>>


Wann wird das dann GENAU ausgeführt

Bei cron.daily um 0:00 Uhr ?
Bei cron.weekly An nem Monatag oder Sonntag 0:00 Uhr ?
Bei /etc/cron.monthly 1.1 0:00

Oder kann man das sogar irgendwo einstellen?

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-12-14 21:43

Hi,
in /etc/crontab steht bei Debian folgendes:

Code: Select all

25 6    * * *   root    test -e /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6    * * 7   root    test -e /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6    1 * *   root    test -e /usr/sbin/anacron || run-parts --report /etc/cron.monthly
Dabei wird also alles in cron.daily jeden Tag um 6:25 Uhr, alles in cron.weekly immer Sonntags um 6:47 Uhr und alles in cron.monthly am 1. jeden Monats umd 6:52 Uhr.

so long
static

z00m
Posts: 5
Joined: 2003-11-13 18:37

Re: Kurz-HowTo: Cronjobs

Post by z00m » 2003-12-15 10:01

:-D Danke! Besser könnte eine Antwort nicht sein :-D

relativity
Posts: 66
Joined: 2003-03-03 14:20

Re: Kurz-HowTo: Cronjobs

Post by relativity » 2003-12-15 10:07

Script wird jede Minute ausgeführt.

Code: Select all

*/1 * * * *   root   /root/scripts/backup.sh 
hmm.. dazu noch eine kleine Frage, dann ist alles schlüssig:
geht auch folgendes:

Code: Select all

*/305 * * * *   root   /root/scripts/backup.sh 
wenn ich will das der cronjob alle 5 Std und 5 Mins ausgeführt wird?

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-12-16 15:38

Hi,
ich hab das zwar nicht ausprobiert, IMHO wird das aber nicht funktionieren, da in 'man 5 crontab' für dieses Feld erlaubte Werte 0-59 steht.

Ich würde das so schreiben:

Code: Select all

5 */5 * * * root /root/scripts/backup.sh
[Edit]
Hm, bei nochmaligem Durchlesen fällt mir auf, dass es doch nicht korrekt ist, denn so würde es alle 5 Stunden um 5 Minuten nach der vollen Stunde und nicht alle 5 Stunden und 5 Minuten ausgeführt.
Sorry, mir fällt grad nicht ein wie man das schreiben könnte, aber für was brauchst du einen solchen Aufruf?
[/Edit]

so long
static

deckel
Posts: 20
Joined: 2003-12-04 12:29

welcher befehl

Post by deckel » 2003-12-16 18:29

es gibt doch sicher ein befehl wo sämtliche cronjob`s angezeigt werden.


oder gibt es da kein befehl


mfg deckel

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2003-12-16 18:40

Hi,
AFAIK gibt's den nicht - du musst dir die wohl oder übel selbst zusammen suchen:

/etc/cron.d
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
/etc/crontab

und die crontabs der User befinden sich (zumindest bei Debian) in

/var/spool/cron/crontabs/

so long
static

Anonymous

Hi

Post by Anonymous » 2004-01-23 10:38

Also ich habe schon einen Cronjob mit 2 Zeilen angelegt, problem ist nur folgendes, worauf hier nicht eingegangen wird. Ich bekomme ständig (also jede Stunde, da ich es stündlich laufen lasse) 2 Mails, weil die beiden Zeilen nicht korrekt ausgeführt worden sind. Da steht dann irgendwo Permission Denied also gibt es da wohl Rechte Probleme. Ich habe diesen Cronjob deshalb extra einmal also normaler Benutzter
und einmal als Root angelegt. Funktioniert beides leider nicht.

funnydingo
Posts: 160
Joined: 2002-12-07 14:40
Location: Münster

Re: Kurz-HowTo: Cronjobs

Post by funnydingo » 2004-04-21 17:47

Vielleicht sollte man noch erwähnen:

Mit jedem Cronjob erfolgt auch eine Meldung im syslog, das dieses Script ausgeführt wurde. Möchte man die Einträge im syslog nicht haben, muss man der Zeile einfach nur ein "-" voranstellen. Beispiel:

Code: Select all

-10 * * * *      root   /root/scripts/backup.sh

Das ganze funktioniert aber nur bei dem User root! Cronjobs von anderen Usern werden immer im syslog festgehalten.

Das ist besonders praktisch bei Cronjobs die sehr häufig ausgeführt werden (ich zum Beispiel habe eins, das alle 5 Minuten ausgeführt wird).

static
Posts: 437
Joined: 2002-10-27 19:56
Location: Schweiz

Re: Kurz-HowTo: Cronjobs

Post by static » 2004-04-21 18:07

Hi,
@FunnyDingo: Thx für die Ergänzung, ich habe diesen Teil nicht erwähnt, da sich mein usprüngliches HowTo auf ein Debiansystem bezog - bei dem dies leider nicht funktioniert. Aber für alle anderen bestimmt ein nützlicher Hinweis.

.static

funnydingo
Posts: 160
Joined: 2002-12-07 14:40
Location: Münster

Re: Kurz-HowTo: Cronjobs

Post by funnydingo » 2004-04-21 18:09

Ah, na gut, das wiederum wusste ich nicht ;-) Man lernt halt nie aus!

hartmutwg
Posts: 18
Joined: 2003-11-15 19:18
Location: Stuttgart

Cronjobs auf 1&1 Rootserver L, Frage

Post by hartmutwg » 2004-04-22 11:19

erst einmal vielen dank für deine anleitung.
ich habe vor kurzem zu einem 1&1 exklusivserver einen 1&1 rootserver L hinzugenommen. auf diesem habe ich nun gegenüber dem exklusiv probleme mit den cronjobs.
auf dem exklusiv sah es z.b. so aus:
# HHC ADSystem jeden Stunde wegen Bannergewichtung und Statistik
0 * * * * lynx -dump
http://www.h-h-c.de/hhc/ads/maintenance/maintenance.php

lief ohne probleme

rootserver:
ich loge mich als web3 mit pass per putty ein, schreibe den cronjob und erhalte die fehlermeldung:
E138: Can't write viminfo file /home/www/web3/.viminfo!

also das ganze noch einmal als root gemacht für nutzer web3 datei wurde erfolgreich gespeichert.
beim aufruf, als web3, crontab -l erhalte ich dann folgendes:
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.1332 installed on Mon Apr 19 21:25:18 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

was soll mir das sagen?

auch werden die eingetragenen cronjobs nicht ausgeführt.

eon kopieren der datei maintenance.php nach etc/dron.daily würde nichts bringen da alle include anweisungen für config, path usw. dann nicht mehr stimmen würden.

thx
hartmut

hartmutwg
Posts: 18
Joined: 2003-11-15 19:18
Location: Stuttgart

ok dann frage ich mal anders

Post by hartmutwg » 2004-04-28 23:26

auf einem 1&1 exklusivserver konnte ich meine cronjobs wie folgt eingeben:
# HHC Chat Service und Hall of Fame
10 00 * * * lynx -dump http://www.h-h-c.de/chat/service/service.php
12 00 * * * lynx -dump http://www.h-h-c.de/chat/service/set_hall_of_fame.php

auf dem rootserver geht dies leider nicht mehr!
wäre hier jemand so nett und würde mir sagen wie ich den gleichen cronjob auf dem rootserver einrichte wenn die dateien im web3 liegen
also http://www.h-h-c.de geht in das web3
in diesem ist der chat unter /chat/ und darunter dann der ordner service/ mit der datei service.php

thx
hartmut

Anonymous

Re: Kurz-HowTo: Cronjobs

Post by Anonymous » 2004-06-04 19:44

wenn ich jetzt will, dass bei einem cronjob eine maiil an eine bestimmte adresse gesendet wird muss ich denn script.pl > email@domain.tld angeben?