Jobs - Zeitgesteuerte Anweisungen


Prozesse oder Programme zu einem bestimmten Zeitpunkt starten oder wiederholt auszuführen.




Programme oder Scripte einmalig zu einer festgelegten Zeit ausführen, hierfür muss der Daemon „atd“ gestartet sein. Das Kommando „batch“ ist ein Teil von „at“ und führt Anweisungen nur aus, wenn die durchschnittliche Systemlast unter 1.5 sinkt oder ein Wert mit dem Befehl „atd“ festgelegt wird. Diese Werte können in der Datei „/var/spool/cron/atjobs/“ entnommen werden.

FIXME


hans@home:~$ /etc/init.d/atd status
atd is running.




Syntax:

  • at [opt] [Zeitangabe] [Kommando/Script] ⇒ Jobs erstellen.
  • batch ⇒ Führt Job aus, wenn Systemlast es zulässt.
  • atq [opt] ⇒ Listet wartende Jobs.
  • atrm [jobnummer] ⇒ Job löschen.




Das Kommando „atq“ zeigt eine Liste der wartenden Jobs. Mit „atrm“ lässt sich ein Job löschen. Mit [Strg + D] wird der Job bestätigt.


Zeitangaben:

  • now | now + 3 days ⇒ Jetzt oder um diese Uhrzeit in drei Tagen. Mögliche Angaben sind auch minutes, hours, weeks und month.
  • today HH:MM ⇒ Heute zu angegebener Uhrzeit.
  • HH:MM | HH:MMam | HH:MMpm ⇒ Heute zu angegebener Uhrzeit.
  • noon ⇒ Um 12:00 Mittags am nächsten Tag.
  • teatime ⇒ Um 16:00.
  • midnight ⇒ Mitternacht.
  • tomorrow HH:MM ⇒ Morgen zu angegebener Uhrzeit.
  • MMDD[CC]YY, MM/DD/[CC]YY, DD.MM.[CC]YY, [CC]YY-MM-DD ⇒ Mögliche Datumsformate.




Optionen:

  • -m ⇒ Ist der Job abgeschlossen wird eine mail an den Nutzer gesendet, selbst wenn der Job keine Ausgabe ausgibt.
  • -f ⇒ Liest den Job von einer Zeilenweise geschriebenen Datei.
  • -t ⇒ Ausführungszeit des Jobs im Format [[CC]YY]MMDDhhmm[.ss].
  • -l ⇒ Liste der wartenden Jobs. Alias zu atq.
  • -d [Jobnummer] ⇒ Löscht Job. Alias zu atrm.
  • -b ⇒ Alias zu batch.
  • -v ⇒ Zeigt die Ausführungszeit des Jobs.
  • -c ⇒ Gibt die anstehenden Jobs nach STDOUT aus.




Berechtigungen:

  • /etc/at.allow ⇒ Wenn die Datei vorhanden ist, dürfen nur Nutzer Jobs ausführen die in der Datei stehen.
  • /etc/at.deny ⇒ Wenn die Datei vorhanden ist, jedoch keine at.allow, dürfen alle Nutzer Jobs ausführen die NICHT in der Datei stehen.



Existiert weder die Datei /etc/at.allow noch /etc/at.deny darf nur root at verwenden. Eine leere /etc/at.deny ermöglicht die benutzung von at für alle User.




Beispiele:

inka@home:~$ at 17:10 today
warning: commands will be executed using /bin/sh
at> /home/inka/backup.sh
at> <EOT>
job 1 at Sat Nov 17 17:10:00 2010

Hier wird um 17:10 ein Backup durchgeführt.


inka@home:~$ echo '/home/inka/backup.sh' | at 18:40
warning: commands will be executed using /bin/sh
job 8 at Sat Nov 17 18:40:00 2010

Alternative Schreibweise.


hans@home:~$ batch
warning: commands will be executed using /bin/sh
at> /home/hans/backup.sh
at> <EOT>
job 7 at Sat Nov 17 18:03:00 2010

Der batch Befehl führt das Kommando aus wenn die Systemlast es zulässt (Standardmäßig 1.5), kann jedoch über den atd Daemon eingestellt werden.


inka@home:~$ at 17:35
warning: commands will be executed using /bin/sh
at> DISPLAY=:0 gcalctool
at> <EOT>
job 4 at Sat Nov 17 17:35:00 2010

Mit der Umgebungsvariable DISPLAY kann mit at die Grafische Oberfläche benutzt werden, dabei muß der Nutzer eingeloggt sein. Hier wird der Taschenrechner gestartet.



atd


Der „atd“ Daemon arbeitet die Jobs in der Warteschlange von „at“ und „batch“ ab und kann für Jobs modifiziert werden.


Syntax:

  • atd [opt] [args]




Optionen:

  • -l ⇒ Die Begrenzung der Auslastung für batch einstellen (Standardwert 1.5). Hierbei steht die 1 für die Anzahl der CPUs.
  • -b [sec] ⇒ Intervall in Sekunden zwischen dem Start von zwei batch Jobs (Standardwert 60 sek.).
  • -d ⇒ Schreibt Fehler Meldungen nach STDERR und syslog.
  • -f ⇒ Startet atd als Vordergrundprozess.
  • -s ⇒ Verarbeitet die at/batch Warteschlange nur einmal. Zur Kompatibilität mit älteren Versionen von atd. atd -s entspricht atrun.






Das Programm „cron“ kann Scripte und Programme chronologisch zu einem bestimmten Zeitpunkt starten, hierfür muß der Daemon „crond“ gestartet sein. Der Daemon wird einmal pro Minute aktiv und analysiert, dabei auch alle cron-Dateien. Es können Systemweite Cronjobs die nur [root] bearbeiten darf erstellt werden. Auch Nutzer können Cronjobs erstellen sofern sie nicht durch die Berechtigungen davon ausgeschlossen wurden. Cron wird u.a. verwendet um Logdateien abzuschneiden und zu komrimieren, temporäre Dateien zu löschen, Verzeichnisse aktualisieren u.v.m.


Um mit „cron“, zeitgesteuerte Jobs auszuführen, muß zum gewählten Zeitpunkt des Jobs das System gestartet sein, ansonsten wird der Job nicht ausgeführt.




Dateien und Verzeichnisse von cron
/etc/crontab Systemweite Konfigurationsdatei von cron
/etc/cron.hourly stündlich auszuführende Jobs
/etc/cron.daily täglich auszuführende Jobs
/etc/cron.weekly wöchentlich auszuführende Jobs
/etc/cron.monthly monatlich auszuführende Jobs
/etc/cron.deny Nutzerberechigungen von cron (Optional)
/etc/cron.allow Nutzerberechigungen von cron (Optional)
/var/spool/cron Speicherort für Benutzerspezifische cronjobs




Berechtigungen:

  • /etc/cron.allow ⇒ Wenn die Datei vorhanden ist, dürfen nur Nutzer Jobs ausführen die in der Datei stehen.
  • /etc/cron.deny ⇒ Wenn die Datei vorhanden ist, jedoch keine cron.allow, dürfen alle Nutzer Jobs ausführen die NICHT in der Datei stehen.





/etc/crontab


Die globale Konfigurationsdatei von „cron“. Es können entweder Scripte in die jeweiligen Verzeichnisse kopiert werden oder die Datei „/etc/crontab“ direkt editiert werden. Die manpage zur „/etc/crontab“ erhält man mit „man 5 crontab“.

FIXME


Beispiel einer crontab (Red Hat):

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
#


Cron soll bei seiner Ausführung die Shell bash verwenden. Die Pfadvariable wird neu deklariert, da cron eine Subshell öffnet. Bei Problemen oder einem Befehl mit Ausgabe bekommt root eine Nachricht, diese können auch an Nutzer gesendet werden.
Cron verwendet zur Laufzeit das Hauptverzeichnis als Heimatverzeichnis.
Unterhalb des Kommentars beginnen die cronjobs die über run-parts die Scripte in den Verzeichnissen ausführt.
Die ersten fünf Felder kennzeichnen den Zeitpunkt der Ausführung des Jobs.


  • Erstes Feld ⇒ Minuten, mögliche Werte sind 0-59.
  • Zweites Feld ⇒ Stunden, mögliche Werte sind 0-23.
  • Drittes Feld ⇒ Tage, mögliche Werte sind 1-31.
  • Viertes Feld ⇒ Monate, mögliche Werte sind 0-12.
  • Fünftes Feld ⇒ Wochentag, mögliche Werte sind 0-7 (0 und 7 bedeuten Sonntag).
  • user ⇒ Gibt den Nutzer an, der den Befehl ausführt.
  • command ⇒ Enthält das auszuführende Kommando oder Script.




Die ersten fünf Felder können auch durch folgende Schlüsselwörter ersetzt werden.

  • @reboot ⇒ Einmal beim Start.
  • @hourly ⇒ Einmal pro Stunde (0 * * * *).
  • @midnight ⇒ Einmal am Tag um 0:00 Uhr (0 0 * * *).
  • @daily ⇒ Einmal am Tag um 0:00 Uhr (0 0 * * *).
  • @weekly ⇒ Einmal pro Woche (0 0 * * 0).
  • @monthly ⇒ Einmal im Monat (0 0 1 0 0).
  • @yearly ⇒ Einmal im Jahr (0 0 1 1 *).
  • @annualy ⇒ Einmal im Jahr (0 0 1 1 *).



Werte können mehrfach belegt werden und werden durch ein Komma (,) getrennt. Zeitangaben von, bis werden mit einem Bindestrich (-) angegeben. Der Asterisk (*) bedeutet jede(r).




Beispiele:

01 * * * * root run-parts /etc/cron.hourly

Hier werden eine Minute nach jeder vollen Stunde an allen Tagen, Monaten, Wochentagen die Scripte im Verzeichnis cron.hourly ausgeführt.


22 4 * * 0 root run-parts /etc/cron.weekly

Die Scripte in cron.weekly werden jeden Sonntag um 4:22 Uhr ausgeführt.


0 8,10,12,14 * * 1-5 root /usr/sbin/script

Script wird von Mo-Fr um 8, 10, 12 und 14 Uhr ausgeführt.


0 8 * */2 * root /usr/sbin/script

Script wird alle zwei Monate um 8 Uhr ausgeführt.



crontab


Mit dem Kommando „crontab“ können Nutzer eine „Cron“ Tabelle anlegen und editieren. Die „crontab“ Datei wird im Verzeichnis „/var/spool/cron/crontabs“ gespeichert. Die Manpage zum Befehl „crontab“ findet man mit „man 1 crontab“.


Syntax:

  • crontab [opt]




Optionen:

  • -e ⇒ Öffnet den Standardeditor zum bearbeiten der cron Tabelle des angemeldeten Nutzers.
  • -l ⇒ Zeigt den Inhalt der Cron Tabelle an.
  • -r ⇒ Löscht die crontab Datei aus /var/spool/cron.
  • -u [user] ⇒ Hier kann root die crontab Datei eines anderen Nutzers anzeigen oder bearbeiten.




Beispiel:

frank@home:~$ crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
*/5 * * * * cat /home/frank/.bash_history | sort | uniq >> ~/Desktop/cmd-history
*/3 * * * * echo hello, cron | wall
#

Im Beispiel wird zu Testzwecken alle fünf Minuten das Kommando „history“ in die Datei „cmd-history“ angehängt und alle drei Minuten eine Nachricht an die Angemeldeten Nutzer gesendet. Es können beliebig viele Jobs untereinander eingetragen werden oder als Kommando eine Textdatei in der Befehle zeilenweise eingetragen werden können.


Hier dürfen keine Nutzer eingetragen werden. Abschließend muß eine Leerzeile oder Kommentarzeichen folgen.




frank@home:~$ crontab -e
crontab: installing new crontab

Der Job ist nun aktiv.


root@home:/var/spool/cron/crontabs# ll
insgesamt 4
-rw------- 1 frank crontab 1145 18. Nov 20:42 frank

Die crontab Datei befindet sich nun im Verzeichnis „/var/spool/cron/crontabs“.


Erzeugt der durch „crond“ aufgerufene Befehl eine Ausgabe oder Fehlermeldung, wird dieser per Mail an den Nutzer weitergeleitet. Um dies zu verhindern muß man die Ausgabe umleiten z.B. nach „/dev/null“.

*/5 * * * * ping -c 1 192.168.0.1 > /dev/null

Hier wird die Standardausgabe von ping nach „/dev/null“ umgeleitet.


*/5 * * * * ping -c 1 192.168.0.1 > /dev/null 2>&1

Hier wird die Standardausgabe und Fehlerausgabe von ping nach „/dev/null“ umgeleitet.




Der Dämon „anacron“ ist ein weiteres Programm zur Automatisierung von Befehlen. Anacron hat den Vorteil dass verpasste Jobs nachgeholt werden, falls das System heruntergefahren oder neugestartet wurde. Dieses Programm darf nur von [root] verwendet werden. Die Konfigurationsdatei von „anacron“ befindet sich in der Datei „/etc/anacrontab“. Scripte die „anacron“ ausführen soll, können in die Verzeichnisse cron.daily, cron.weekly und cron.monthly kopiert oder Verlinkt werden. Kürzere Perioden als täglich ist mit „anacron“ nicht möglich. Die Zeitstempel Dateien werden in der Datei „/var/spool/anacron/“ gespeichert.


Syntax:

  • anacron [opt] [job]




Optionen:

  • -f ⇒ Jobs ausführen, ignoriert Zeitstempel.
  • -u ⇒ Zeitstempel auf aktuelles Datum setzen, Jobs werden nicht ausgeführt.
  • -s ⇒ Nächster Job wird nur gestartet wenn letzter Job beendet ist.
  • -n ⇒ Jobs sofort ausführen, ignoriert Zeitverzögerung nach Systemstart.
  • -d ⇒ Jobs nicht im Hintergrund ausführen. Programmausgaben werden nach STDERR und syslog und mail geschrieben.
  • -q ⇒ Unterdrücken von Meldungen auf Standard Fehler Ausgabe. Nur in Verbindung mit-d.
  • -t [anacrontab] ⇒ Angegebene anacrontab, anstatt der Standard-anacrontab.
  • -T ⇒ Testet anacrontab Datei auf Fehler.
  • -S [spooldir] ⇒ Spool Verzeichnis für Zeitstempel Dateien selbst festlegen.
  • -V ⇒ Zeigt Programmversion.
  • -h ⇒ Zeigt kurze Hilfe.




Beispiel einer anacrontab (Red Hat):

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

1       65      cron.daily              run-parts /etc/cron.daily
7       70      cron.weekly             run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly



  • Erstes Feld ⇒ Periode der Jobausführung in Tagen (period).
  • Zweites Feld ⇒ Startverzögerung nach Systemstart in Minuten (delay).
  • Drittes Feld ⇒ Zeitstempel Datei (job-identifier).
  • Viertes Feld ⇒ Befehl oder auszuführendes Script (command).




Die „/etc/anacrontab“ kann noch wie folgt angepaßt werden.

START_HOURS_RANGE=8-16

Wird das System nicht ausgeschaltet, entscheidet START_HOURS_RANGE zu welcher Tageszeit die Jobs ausgeführt werden.


RANDOM_DELAY=42

Zufällige Anzahl an Minuten zur Verzögerungszeit hinzufügen. Hier wird eine Verzögerung von 0-42 Minuten zur Startverzögerung hinzugefügt.


MAILTO="user@localhost"

Automatisch Mails versenden. Hierfür muß ein MTA (Mail Transfer Agent) installiert sein.




Befehl funktioniert in der Shell, jedoch nicht im Cronjob


Ursachen hierfür kann sein, dass „cron“ den Pfad nicht findet, da „cron“ nicht die (PATH Variable) des Users benutzt. Als Lösung kann man entweder die (PATH Variable) in der Datei „crontab / anacrontab“ ergänzen oder ruft die Programme mit voller Pfadangabe auf.

Es kann auch möglich sein, dass sich das Verhalten einer über „cron“ gestarteten Shell von der Loginshell unterscheidet. Hierfür kann man die Konfigurationsdatei „crontab“ folgendermaßen anpassen:

0 8,10,12,14 * * 1-5 root /bin/bash --login /usr/local/sbin/script





"date" Formate in der "crontab"


Cron interpretiert "%" als Zeilenumbruch, werden z.B. date Formate in die crontab eingetragen. Hier müssen alle "%" Zeichen mit einem Backslash escaped (date +„\%Y\%m\%d-\%H_\%M“) oder über ein Script ausgeführt werden.



Cloud