Start Systemverwaltung Zeitgesteuerte Aufgaben
Zeitgesteuerte Aufgaben E-Mail
Geschrieben von: tpm   

Zur Automatisierung von Prozessen ist die Möglichkeit der zeitgesteuerten Ausführung ein wichtiges Element. Unter Linux nennt man zeitgesteuerte Aufgaben auch Cronjobs. Beispiele zur zeitgesteuerten Ausführung von Aufgaben wären das Backup von Daten in regelmäßigen Intervallen oder stündliche E-Mail Benachrichtigungen über den Status des Systems an den Administrator.

 

Der Begriff Cronjob ist ein umfassendes Synonym für die komplette Arbeitsfolge einer zeitgesteuerten Aufgabe. Beim Systemstart wird der zuständige Dienst crond gestartet, der die Crontab-Dateien verwaltet. Der Dienst erkennt Änderungen anhand des Zeitstempels der letzten Änderung. Daher muss der Dienst nach dem Hinzufügen von neuen Einträgen in den Crontab-Dateien auch nicht neu gestartet werden.

Für die Umsetzung der Cronjobs bedient man sich folgender Möglichkeiten:

  • Textdateien in denen angegeben wird, zu welcher exakten Zeit was ausgeführt werden soll. Diese Textdateien beinhalten ein vorgegebenes Format für den inhaltlichen Aufbau. Sie werden daher auch Crontab-Dateien genannt.
  • Ordner in denen direkt Scripte abgelegt werden können, die stündlich, täglich, wöchentlich oder monatlich ausgeführt werden.
  • Ordner in denen weitere Crontab-Dateien von Programmen abgelegt werden können.

Die erste Crontab-Datei hat den absoluten Pfad /etc/crontab und ist aufgrund der standardmäßigen Zugriffsbeschränkung für systemweite Aufgaben des Administrators vorgesehen.

 

example
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 * * sun 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 )

 

Als erstes wird die anzuwendende Shell angegeben, gefolgt vom Suchpfad für durchzuführende Befehle. Darauf folgt die eigentliche Crontab-Syntax: minute, hour, day of month, month, day of week, der ausführende Benutzer und die auszuführende Kommandokette.

Für die Wertevergabe gibt es natürlich einige Basisregeln:

  • Für die Minuten ist der Bereich 0-59 zulässig
  • Für die Stunden ist der Bereich 0-23 zulässig
  • Für den Monatstag ist der Bereich 1-30 zulässig
  • Für den Monat ist der Bereich 1-12 zulässig, sowie die 3-stelligen Kürzel (jan, feb, mar,...)
  • Für die Wochentage ist der Bereich 0-7 zulässig (0 und 7 ist jeweils Sonntag), sowie die 3-stelligen Kürzel (sun, mon,...)
  • Ein * bedeutet zu jeder Zeit.
Mit diesen Vorgaben lassen sich die Einträge recht einfach interpretieren:
  1. Ausführung zur 17. Minute jeder vollen Stunde (...8:17, 9:17...22:17, unsw.)
  2. Ausfürhung um 6:25 Uhr an jedem Tag im Jahr
  3. Ausfürhung an jedem Sonntag um 6:47 Uhr
  4. Ausführung um 6:52 Uhr an jedem 1. des Monats
Möchte man die Ausführung noch weiter präzisieren, kann man sich einiger Mischformen bedienen:
  • */10 in der Spalte Minute bedeutet alle 10 Minuten
  • 15, 45 in der Spalte Minute bedeuten zu jeder 15. und 45. Minute
  • 2-4 in der Spalte Wochentag bedeutet Dienstags, Mittwochs und Donnerstags
Dem selben Schema folgend befinden sich in dem Verzeichnis /var/spool/cron/crontabs/ die Crontab-Dateien der anderen Benutzer. Diese sind in der Regel einfach nach dem jeweiligen User benannt.

Wie der Crontab-Datei des Administrators zu entnehmen ist, gibt es im Verzeichnis /etc noch weitere wichtige Ordner, die mit Cronjobs zusammenhängen:
  • cron.hourly
  • cron.daily
  • cron.weekly
  • cron.monthly
Darin kann der Administrator eigene Scripte ablegen, deren zeitliche Ausfrührung letztendlich durch die obige Crontab-Datei aungestoßen wird.

Nun wäre es ja praktisch, wenn auch Programme selbstständig Cronjobs vergeben könnten. Dazu ist der Ordner /etc/cron.d vorgesehen. Dort können Programme ihre eigenen Crontab-Dateien ablegen. Der Dateiname der Crontab-Datei folgt in der Regel dem Namen des Programms, dass es dort abgelegt hat. Als Beispiel die Crontab-Datei des Programms mdadm, welches für die Verwaltung von Software-Raids verantwortlich ist:

example
# cron.d/mdadm -- schedules periodic redundancy checks of MD devices
#
# Copyright © martin f. krafft madduck[at]madduck[dot]net
# distributed under the terms of the Artistic Licence 2.0
#
# $Id: mdadm.cron.d 147 2006-08-30 09:26:11Z madduck $
#
# By default, run at 01:06 on every Sunday, but do nothing unless the day of
# the month is less than or equal to 7. Thus, only run on the first Sunday of
# each month. crontab(5) sucks, unfortunately, in this regard; therefore this
# hack (see #380425).
6 1 * * 0 root [ -x /usr/share/mdadm/checkarray ] &&
[ $(date +\%d) -le 7 ] &&
/usr/share/mdadm/checkarray --cron --all --quiet

Natürlich ist dieser Ordner nicht auf Crontab-Dateien von Programmen beschränkt. Auch der Administrator kann dort seine Cronjobs definieren. Ob er sie nun hier oder in der Datei /etc/crontabs definiert, bleibt dem Administrator überlassen.

Das Ganze System soll mit folgendem Schaubild nochmal verdeutlicht werden:

Der Dienst crond und seine Funktionsweise

Zur Rekapitulation: Beim Systemstart wird durch den Mutterprozess init der Dienst crond gestartet. Dieser prüft selbstständig die Inhalte der Crontab-Dateien und fürht diese zu den angegebenen Terminen aus. Entweder direkte Kommandoketten, welche sich in der Crontab-Datei selbst befinden oder Scripte, auf die von den Crontab-Dateien aus verwiesen wird.

Da Crontabs nur regelmäßig wiederkehrende Aufgaben verwalten, fehlt noch eine Möglichkeit eine Aufgabe nur 1x in der Zukunft ausführen zu können. Dazu wird der Befehl at verwendet. Dieser ist in seinen Zeitangaben sehr flexibel. So ist es nicht nur möglich die Ausführung zu einer vorgegebenen Uhrzeit anzugeben,

input
at 08:30 Aug 12
at> echo "Heute hat Peter Geburtstag!"
at> < EOT >

 

sondern beispielsweise auch zu einer Uhrzeit eine Zeitperiode hinzu zu addieren.


input
at now + 3 hours
at> echo "Du sitzt schon wieder 3 Stunden vor dem PC!"
at> < EOT >

Nach der Ausführung von at, gefolgt vom Termin, startet mit at> ein Eingabdialog. Darin lassen sich beliebig viele Befehle definieren. Wenn man fertig ist, erzeugt man mit der Tastenkombination STRG+D die EOT-Sequenz.

Alternativ zur Eingabemethode kann man natürlich auch direkt auf ein Script verweisen, dass zu einem bestimmten Zeitpunkt einmal ausgeführt werden soll.

input
at midnight -f /home/pace/start_downloads.sh

Man sieht, die Optionen von at sind sehr sehr umfangreich. Weitere Kombinationsmöglichkeiten kann man der Manpage entnehmen.

Zwei weitere Befehle zur Verwaltung von at sind atq und atrm. Durch atq werden alle noch nicht ausgeführten at-Jobs inklusive ihrer Job-ID aufgelistet. Mit atrm lassen sich at-Jobs durch die Angabe ihrer Job-ID wieder entfernen.

Zuletzt aktualisiert am Mittwoch, den 15. September 2010 um 07:38 Uhr