Dies ist eine alte Version des Dokuments!


Der Task Scheduler »cron«

Der (Debian) cron-Daemons wird in unixoiden Systemen zur Ausführung periodisch wiederkehrender Aufgaben verwendet. Als root dürfen Sie auch »crontabs«1) für andere Benutzer anlegen (crontab -u $USER -e). Die »crontabs« aller User befinden sich im cron-Spoolverzeichnis unter »/var/spool/cron/crontab«, die Datei »/etc/crontab« ist das systemweit gültige crontab-File. Im Gegensatz zu den cron-Tabellen der einzelnen User befindet sich in der »/etc/crontab« eine zusätzliche siebte Spalte, welche den User angibt unter welchen Rechten das Kommando läuft (IdR ist das root).

Struktur einer »crontab«

Aubau der /etc/crontab

* * * * * User auszuführender Befehl
| | | | | |
| | | | | +---> Benutzer (nur /etc/crontab)
| | | | +-----> (dow) Day of week; Wochentag (0-7) (Sonntag =0 oder =7)
| | | +-------> (mon) Monat (1-12)
| | +---------> (dom) Day of month; Tag (1-31)
| +-----------> (h) Stunde (0-23)
+-------------> (m) Minute (0-59)

→ So bedeutet zB »15 8 * * * mpg321 -z /home/pronto/mp3/*«, dass jeden Tag pünktlich um viertel nach Acht alle Dateien im Verzeichnis »/home/pronto/mp3« in zufälliger Reihenfolge abgespielt werden. Wer am Wochenende gerne länger schlafen möchte, ersetzt das letzte Sternchen durch die entsprechenden Wochentage (durch Komma getrennt) in zB »1,2,3,4,5« oder definiert einen ganzen Bereich zB mit »1-5«. Auch Kombinationen sind Möglich: Steht im vierten Feld, das den Monat bezeichnet, zB »1-4,7,10-12« ist damit von Januar bis April, Juli und Oktober bis Dezember gemeint.

Möchten Sie statt zu einem festgelegten Startzeitpunkt einen Task zB alle fünf Minuten laufen lassen, stellen Sie im Minuten Feld einfach ein »*/« voraus. Alle fünf Minuten wäre demnach »*/5 * * * *« oder alle zwei Stunden »* */2 * * *« usw.

»crontab« anlegen und bearbeiten

Wie bereits erwähnt darf root »crontabs« für die im System vorhandenen Benutzer anlegen:

# crontab -u pronto -e (cr)

Das og Kommando legt zB eine »crontab« für den Benutzer (-u) »pronto« an und startet gleich den in »/etc/alternatives/editor« eingestellten Editor (-e) und wartet auf Ihre Eingabe. Die »crontab« für den Benutzer pronto wird in »/etc/spool/cron/crontabs« angelegt.

# ls -l /var/spool/cron/crontabs/ (cr)
-rw——- 1 pronto crontab 263 31. Okt 21:46 pronto

Als normaler Benutzer haben Sie auf das Verzeichnis »/var/spool/cron/crontabs« keinen Zugriff (auch keinen read only), Sie können sich aber Ihre persönliche »crontab« direkt über das »crontab -l« Kommando anzeigen lassen:

$ whoami (cr)
pronto
$
$ crontab -l (cr)
# m h  dom mon dow   command
* 22 * * * touch /tmp/pronto.txt

Die »crontab« für den User pronto ist im og Beispiel zB so eingestellt, dass täglich um 22:00 die Datei »/tmp/pronto.txt« angelegt wird.

Als root können Sie weiterhin die »crontabs« aller Benutzer verwalten, hängen Sie hier einfach den gewünschten Benutzernamen hinter den Parameter »-u«:

# whoami (cr)
root
# crontab -l -u pronto (cr)
# m h  dom mon dow   command
* 22 * * * touch /tmp/pronto.txt 

Wenn Sie einzelne Jobs löschen möchten, können Sie wieder den Editor mit »crontab -e« aufrufen; mit »crontab -r« löschen Sie alle Einträge bzw. die gesamte »crontab« in einem Rutsch.

Die systemweite »crontab« → /etc/crontab

Neben den »crontabs« der einzelnen Benutzer gibt es mit der »/etc/crontab« eine systemweite Cron-Tabelle, die Aufgaben der Systemverwaltung automatisiert. Im Gegensatz zu den Cron-Tabellen der einzelnen Benutzer gibt es hier ein siebtes Feld, welches den Usernamen enthält unter welchen der Befehl ausgeführt wird. Eine typische »crontab« auf einem Debian Linux System sieht zB folgendermaßen aus:

/etc/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 )
#


Hier stehen schon einige Einträge, welche Sie sich zu Nutze machen können, welche aber vermutlich erst mal einer Erklärung bedürfen. Hier finden Sie vier Befehle welche jede Stunde 17 Minuten nach jeder vollen Stunde ausgeführt werden »cron.hourly«, jeden Tag um 06:25 »cron.daily«, jede Woche am Sonntag um 06:47 »cron.weekly« und jeden ersten Tag im Monat um 06:52 »cron.monthly« ausgeführt werden.

Die »test«2) Anweisung »test -x /usr/sbin/anacron« bewirkt, dass die Programme in »/etc/cron.[daily|weekly|monthly]« nur dann ausgeführt werden, wenn »anacron«3) nicht eingerichtet ist, was standardmäßig auch nicht der Fall ist und bei einem 24/7 Server auch nicht notwendig ist, da dieser zu jedem geplanten Zeitpunkt läuft. Wäre »anacron« eingerichtet, würden die Befehle auch dann beim Systemstart (mit einer konfigurierbaren Verzögerung) ausgeführt werden, wenn das System zum angegebenen Zeitpunkt nicht eingeschaltet war, »cron« tut dies nicht. Die Kommandoverkettung »||« (= EXOR ≙ exklusives Oder) führt das zweite Kommando nur dann aus, wenn das erste erfolglos war. Andernfalls würden »cron« und »anacron« beide versuchen die Aufträge in »/etc/cron.[daily|weekly|monthly]« auszuführen. Die »run-parts«4) Anweisung führt dann jedes Skript im angegeben Verzeichnis aus.

Sie können sich demnach auch dieser bereits vorkonfigurierten Tasks bedienen und Ihr Skript einfach in ein passendes Verzeichnis (daily, weekly oder monthly) legen und »cron« den Rest erledigen lassen, wenn sich der Zeitpunkt mit Ihren Anforderungen vereinbaren lässt. Aber auch hier sollten Sie mit Umsicht und Bedacht ans Werk gehen. Vermeiden Sie last-intensive Jobs in den Standardtasks, da ja zum selben Zeitpunkt die anderen Jobs auch ausgeführt werden. Legen Sie sich hierfür einen neuen Eintrag in der »crontab« an, der sich mit den vorhandenen Systemressourcen besser vereinbaren lässt oder verwenden Sie »/etc/cron.d«


/etc/cron.d

Das Verzeichnis »/etc/cron.d/« wird von »cron« ebenfalls nach Dateien durchsucht, welche Jobs zum Ausführen enthalten. Jedoch muss hier die Zeitkonfiguration in den einzelnen Dateien festgelegt werden. Die Syntax entspricht der »/etc/crontab«, was uA bedeutet, dass das User-Feld besetzt sein muss:

/etc/cron.d/rmtest

*/3 * * * * root /bin/rm /tmp/test

»cron« ließt nun in regelmäßigen Abständen (wenige Minuten) die Dateien in »/etc/cron.d« und führt die dort konfigurierten Kommandos zum festgelegten Zeitpunkt aus. Im og Beispiel wird alle drei Minuten die Datei /tmp/test gelöscht.

Auszug aus der cron Manpage:

»cron also reads /etc/crontab, which is in a slightly different format (see crontab(5)). Additionally, cron reads the files in /etc/cron.d: it treats the files in /etc/cron.d as in the same way as the /etc/crontab file (they follow the special format of that file, i.e. they include the user field). However, they are independent of /etc/crontab: they do not, for example, inherit environment variable settings from it. The intended purpose of this feature is to allow packages that require finer control of their scheduling than the /etc/cron.{daily,weekly,monthly} directories to add a crontab file to /etc/cron.d. Such files should be named after the package that supplies them. Files must conform to the same naming convention as used by run-parts(8): they must consist solely of upper- and lower-case letters, digits, underscores, and hyphens. If the -l option is specified, then they must conform to the LSB namespace specification, exactly as in the --lsbsysinit option in run-parts.



Verwandte Artikel:
-> Der UNIX Task Scheduler »at«
-> Launchd Task Scheduler konfigurieren (Mac OSX)



pronto 2010/11/01 00:12
<fbl>

tux/cron.1301579016.txt.gz (16148 views) · Zuletzt geändert: 2011/04/17 00:37 (Externe Bearbeitung)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0