Wiederkehrende Aufgaben automatisieren (mittels Cron und Anacron)

Anacron ist eine Ergänzung zum System-Daemon “Cron” der für die automatisierte Ausführung definierter Tätigkeiten zu definierten Zeiten verantwortlich ist. Da Cron primär für Server designed ist, die
im Normalfall rund um die Uhr laufen, ist dieser nicht zu 100% übertragbar auf Desktop-PCs welche hin und wieder auch mal ausgeschaltet sind.

Würde man nur auf Cron vertrauen müssen, könnte es sein, dass wenn der Rechner zu einer speziellen Zeit eben nicht läuft, wichtige Prozesse die für diese Zeit geplant gewesen wären eben nicht gestartet werden.

Cron kümmert sich dann auch nicht mehr darum, dass der versäumte Start der Aufgabe nachgeholt wird.
Um dieses Verhalten, an die Anforderungen von Desktop-Systemen an zu passen wurde “Anacron” als Ergänzung zu Cron (nicht als Ersatz!) entwickelt. Anacron ist anders als Cron kein Deamon im eigentlichen Sinne,
also kein Dienst der ständig im Hintergrund läuft und darauf prüft, ob er nicht endlich mal etwas zu tun bekommt.
Anacron wird vielmehr von Cron gestartet, sieht nach, ob Aufgaben anstehen und arbeitet diese dann ab. Nach Beendigung der offenen Aufgaben, wird Anacron dann auch schon wieder beendet.

Anders als Cron, besitzt nicht jeder User eine eigene Anacrontabelle, welche man z.B. bei Cron mittels “crontab -e” editieren kann. Daher sollte man die systemweite Anacrontab (/etc/anacrontab) auch nur für systemweite
Dienste verwenden bzw. Konfigurieren, für Benutzerspezifische Aufgaben sollte eine spezielle Benutzer-Instanz erzeugt werden.

Dies möchte ich euch mit diesem Artikel zeigen…

Im Weiteren gehe ich davon aus, dass es um einen

  • im bestimmten Turnus wiederkehrenden Job geht
  • der Job nicht mit Root-Privilegien ausgeführt werden muss
  • der Job eventuell eine GUI Anwendung startet
  • die Aufgabe nicht “zu einer ganz bestimmten Zeit” (z.B. immer um genau 13:05 Uhr) abgearbeitet werden muss
  • es sich bei dem betreffenden Rechner sich um ein System mit grafischer Oberfläche handelt
  • kein Emailversand bei Fehlern gewünscht ist, bzw. anderweitig erfolgt.
  • der notwendige Zeitintervall zwischen einem Job nicht kürzer als 1 Tag ist

Sollte wider allen Vermutungen Anacron noch nicht auf eurem System installiert sein, könnt ihr dies bei Debian-basierenden Linux-Distributionen folgendermaßen nachholen:

sudo apt-get install anacron

Wie kann ich nun meine Aufgaben zeitsteuern ?

Da Anacron, grundsätzlich von Cron gesteuert (aufgerufen wird) legt sich der betreffende Benutzer erst einmal eine (benutzerspezifische) Crontab an, welche er mit “crontab -e” (im Terminal) editieren kann (sollte der Benutzer noch keine eigene crontab besitzen wird damit auch gleichzeitig einen neue Tabelle angelegt).

In dieser Tabelle wird ein Job eingetragen, der eine (Benutzer-)Instanz von Anacron aufruft, welche mit einer eigenen anacrontabelle als auch einem definierten Ablageort für notwendige Dateien definiert wird.

Die Syntax von Cron-Tabellen-Einträgen, findet sich in den Manuals von Cron bzw. Crontab. (man 5 crontab, ruft die Sektion 5 des Manuals auf)

Hier das Beispiel, einen benutzerspezifischen Anacronjob stündlich auf zu rufen:


SHELL=/bin/sh
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/bin:/usr/bin/X11

# start anacron user-instance at boot-time and that hourly
@reboot /usr/sbin/anacron -t /home/[user]/.anacron/anacrontab -S /home/[user]/.anacron/spool &> /home/[user]/.anacron/anacron.log
@hourly /usr/sbin/anacron -t /home/[user]/.anacron/anacrontab -S /home/[user]/.anacron/spool &> /home/[user]/.anacron/anacron.log

  • Es wird also stündlich (@hourly) das Programm anacron aufgerufen,
  • dessen “Standard-Tabelle” (/etc/anacrontab) durch eine benutzerdefinierte (-t /pfad/zur/tabelle) ersetzt wird
  • als spool-Verzeichnis zur Ablage der Zeitstempeldateien (-S /pfad/zur/spool) wird ein benutzerspezifisches Verzeichnis angegeben
  • und Ausgaben von anacron ($> leitet sowohl stdout als auch stderr um) werden in eine spezielle Logdatei umgeleitet.

Da “@hourly” als “zur vollen Stunde” übersetzt werden kann, heißt dies, dass anacron nicht unbedingt gleich bei jedem boot aufgerufen wird, sondern dann, wenn der große Zeiger das nächste mal ganz oben ist 🙂 Es ergibt daher Sinn, anacron zusätzlich nach jedem boot zu starten (@reboot)

Hinweis: Natürlich kann man hierin auch noch andere Aufgaben hinterlegen.

Folgende Stichwortsteuerungen sind noch möglich:

(Auszug aus dem sehr guten Wiki von Ubuntuusers.de)

String Bedeutung cron-Schreibweise
@reboot einmalig beim Start
@daily einmalig pro Tag 0 0 * * *
@hourly zur vollen Stunde 0 * * * *
@weekly einmal pro Woche 0 0 * * 0
@monthly einmal pro Monat 0 0 1 * *
@yearly einmal pro Jahr 0 0 1 1 *

Allerdings sei auch hier nochmal auf die einleitenden Sätze und die Nachteile von Cron gegenüber Anacron für Desktop-PC-Benutzer hingewiesen!
In den meisten Fällen ergibt es mehr Sinn, die Jobs in die Anacrontab anstatt in die Crontab ein zu tragen.

Um nun die oben bereits referenzierten Dateien zu erzeugen sind folgende Schritte notwendig:

cd ~
mkdir .anacron && cd .anacron
mkdir spool cron.daily cron.weekly cron.monthly
sudo cp /etc/anacrontab ~/.anacron/anacrontab
sudo chown -cR [user]:[user] anacrontab

WICHTIG: Diese muss entsprechen geändert werden! (siehe unten)

Anschließend kann die neu erstellte anacrontab editiert werden (~/.anacron/anacrontab)

Erst einmal ändert man die auf die Systemordner verweisenden Pfade ab. Anschließend können eigene Jobs hinzugefügt werden.

Die erste Zahl lässt sich auch hier wieder durch die Shortcuts bzw. die “@reboot/daily/hourly/weekly…” ersetzen

Zu beachten ist jedoch, dass die kürzest mögliche Pause zwischen den Aufrufen von zeitgesteuerten Jobs bei Anacron 1 Stunde (@hourly) ist. Darum wird Anacron auch stündlich von Cron aufgerufen (siehe oben)

Und an dieser Stelle sind wir auch schon bei der Alternative zur weiteren Pflege / Bearbeitung der Anacrontab pro vorgesehenem Job… Aus diesem Grund haben wir jeweiligen Ordner bereits weiter oben angelegt (mkdir cron.daily, cron.weekly ….)

Diese Ordner (im Userverzeichnis) werden nun stündlich überprüft ob darin Scripte liegen, welche noch nicht aufgerufen wurden bzw. zum wiederholten Aufruf anstehen, weil der letzte Aufruf hierzu bereits zu lange zurückliegt! (Ich denke die Ordnernamen sind selbsterklärend)

WICHTIG: Scripte (auch symbolische Links) starten aus o.g. Ordnern nur, wenn sie ohne File-extention abgespeichert sind! aus script.sh muss also script werden.

Grafische Anwendungen mit Anacron bzw. Cron starten ?

Cron und damit auch Anacron wird ein einer Shell gestartet, nur sehr wenige Umgebungsvariablen gesetzt hat. (Könnt ihr testen mit /bin/sh -c “[Befehl]”)

Will man mittels Cron oder Anacron eine grafische Anwendung starten, muss man definieren, welches Display für die Darstellung verwendet werden soll. Es kann in bestimmten Fällen auch notwendig sein die Sprache fest zu legen, speziell dann wenn “Umlaute” (äöüß) zur Anwendung kommen könnten (typisch sind hierbei Probleme mit “libnotify”, welches wohl giftig auf nicht gesetzte Language-Variablen reagiert..)

Daher sind unter den bereits enthaltenen Definitionen von PATH und SHELL noch folgende weitere Variablen zu setzen:

DISPLAY=:0
XAUTHORITY=/home/[user]/.Xauthority
LANG=de_DE.UTF-8

<ü>Ist man sich nicht sicher, welchen Inhalt, o.g. Variablen im tatsächlichen User-Enviroment tragen, kann man diese auch einfach in einem Terminalfenster ausgeben lassen:

echo $DISPLAY
echo $XAUTHORITY
echo $LANG

zum Schluss müsste die fertige Benutzer-Anacrontab wie folgt aus:

# /etc/anacrontab: configuration file for anacron

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

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DISPLAY=:0 #= echo $DISPLAY aus dem Terminal
XAUTHORITY=/home/[USER]/.Xauthority #= echo $XAUTHORITY aus dem Terminal
LANG=de_DE.UTF-8 #= echo $LANG aus dem Terminal

# These replace cron's entries
1 5 cron.daily run-parts --report /home/[USER]/.anacron/cron.daily
7 10 cron.weekly run-parts --report /home/[USER]/.anacron/cron.weekly
@monthly 15 cron.monthly run-parts --report /home/[USER]/.anacron/cron.monthly
1 3 gui_prog_1 cd /home/[USER]/Path/to/folder && /usr/bin/python gui_script.py

An dieser Stelle sollte man anacron mit o.g. Tabelle und Einstellungen testen! Hierzu gibt es die Parameter “-n” (now) und “-d” (debug). Auf die Umleitung der Ausgabe in eine Datei verzichten wir in diesem Fall.

Der Befehl zum testen eurer neuen anacrontab müsste also so lauten:

/usr/sbin/anacron -n -d -t /home/[user]/.anacron/anacrontab -S /home/[user]/.anacron/spool

Ihr solltet die Ausgabe von Anacron in eurem Terminalfenster sehen. Falls ihr in eurer Anacrontab GUI Anwendungen starten wollt, sollten sich diese dann öffnen.

Durch einen Reboot, wird nun deine neue zeitgesteuerte, benutzerdefinierte, GUI-fähige Abarbeitung deiner wiederkehrenden Aufgaben aktiviert.

Viel Spaß!

Hinweis: Solltest du bei grafischen Anwendungen ein etwas “altbackendes Erscheinungsbild” bemerken, empfehle ich dir diesen Artikel: QT APPLIKATIONEN SEHEN AUS WIE ZU WIN95 ZEITEN, SOBALD DIESE ALS „ROOT“ AUSGEFÜHRT WERDEN!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.