NetBSD: anacron - die etwas andere Zeitschaltuhr
Inhalt
Anacron installieren und konfigurieren
Hinweis: Soweit nicht anders erwähnt, müssen alle Schritte
in dieser Anleitung als Superuser
root ausgeführt werden, da es
sich um administratorische Arbeiten handelt, die weitreichende Rechte
erfordern. Nach Beendigung der Konfiguration darf man aber nicht vergessen,
sich wieder als normaler User am System anzumelden!
Weiterhin wird vorausgesetzt, daß die NetBSD-Package-Collection
(
pkgsrc) korrekt installiert ist.
Auf jedem Serversystem gibt es verschiedene Dienste, die regelmäßig
(z.B. jede Woche) ausgeführt werden müssen. Dazu zählt z.B. das
Rotieren von Logdateien mittels
newsyslog, das Aktualisieren der
locate-Datenbank oder auch das
in meiner
NetBSD-IMAP-Anleitung
beschriebene Skript
bogo_train.
Bei einem klassischen Serversystem, das 24 Stunden pro Tag durchläuft, wird
diese Aufgabe typscherweise von dem Daemon
cron mit sogenannten
"Cronjob" erledigt. Voraussetzung dafür ist allerdings, daß das System
dafür tatsächlich läuft.
Mit einem kleinen Beispiel kann man diese Problematik sehr schnell verdeutlichen:
Angenommen, man erstellt einen Cronjob, der jeden Sonntag um 15 Uhr eine neue
locate-Datenbank erzeugt. Der zugehörige Rechner steht aber in einem Büro,
und ist nur von Montags bis Freitags eingeschaltet. Infolge dessen wird die
locate-Datenbank
nie aktualisiert werden - weil der Cron-Daemon diesen
Befehl eben nur
genau Sonntags um 15 Uhr startet. Läuft das System zu
diesem Zeitpunkt nicht, wird der Befehl auch nicht ausgeführt.
Zur Umgehung dieses Problems bietet es sich an,
cron mit dem Programm
anacron zu kombinieren.
anacron hat andere Stärken als
cron, es merkt sich nämlich, wann welches Programm zuletzt ausgeführt
worden ist. Beispielsweise kann man für die
locate-Datenbank einstellen,
daß sie alle 7 Tage aktualisiert werden soll. Stellt
anacron nun beim
Systemstart fest, daß seit dem letzten Programmstart z.B. 8 Tage vergangen sind (oder
auch beliebig mehr), so wird ein Update der Datenbank gestartet. Auf diese Weise ist
sichergestellt, daß alle notwendigen Systemdienste auch dann regelmäßig
ausgeführt werden, wenn der Rechner nicht 24 Stunden pro Tag
durchläuft.
Im Gegensatz zu
cron arbeitet
anacron allerdings eher "ungenau", d.h.
das kleinste einstellbare Intervall ist ein Tag. Dienste, die häufiger ausgeführt werden
sollen (z.b. jede Stunde oder alle 15 Minuten) muß man weiterhin von
cron
starten lassen. Denn hier liegt die Stärke von
cron, das sehr exakte
(minutengenaue) Aufrufe ermöglicht.
Bevor ich das genaue Zusammenspiel von
cron und
anacron auf einer
typischen NetBSD-Installation beschreibe, gilt es ersteinmal,
anacron zu installieren.
cron gehört zur NetBSD-Grundinstallation, muß also nicht installiert
werden. Die Installation von
anacron läuft NetBSD-typisch ab:
root@host:~> cd /usr/pkgsrc/time/anacron
root@host:/usr/pkgsrc/time/anacron> make install
Damit
anacron auch bei jedem Systemstart aufgerufen wird, kopiert man das Startskript
nach
/etc/rc.d/ mittels
root@host:~> cp /usr/pkg/share/examples/rc.d/anacron /etc/rc.d/
und aktiviert es in der
/etc/rc.conf mit dem Eintrag
anacron=YES
anacron_flags="-s"
Der Eintrag
anacron_flags="-s" sorgt dafür, daß
anacron
die aufzurufenden Programme nacheinander abarbeitet. Damit kann man auf schwächer
dimensionierten Systemen eine zu hohe Systemlast verhindern. Nähere Informationen
dazu finden sich in der guten Manpage unter
man 8 anacron
Nun muß man dafür sorgen, daß sich
cron und
anacron nicht gegenseitig stören. Denn für das korrekte Funktionieren
von
anacron ist wichtig, daß die davon kontrollierten Dienste nicht an
anacron vorbei aufgerufen werden, z.B. durch einen Cronjob. Also gilt es die
crontab des Users
root entsprechend anzupassen, die alle entsprechenden
Cronjobs enthält. Der dazu nötige Befehl lautet
crontab
-e und öffnet die
crontab im jeweiligen Lieblingseditor (der in der
Umgebungsvariable $EDITOR eingestellt ist). Unter NetBSD sieht sie standardmäßig
folgendermaßen aus:
#
SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
CRON_WITHIN=7200
#
#minute hour mday month wday command
#
*/10 * * * * /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0 * * * * /usr/bin/newsyslog
#
# do daily/weekly/monthly maintenance
15 3 * * * /bin/sh /etc/daily 2>&1 | tee /var/log/daily.out | sendmail -t
30 4 * * 6 /bin/sh /etc/weekly 2>&1 | tee /var/log/weekly.out | sendmail -t
30 5 1 * * /bin/sh /etc/monthly 2>&1 | tee /var/log/monthly.out | sendmail -t
Zu Beginn der Datei werden ein paar allgemeine Variablen gesetzt. In den danach
folgenden Zeilen (Kommentarzeilen werden mit einer
# eingeleitet)
ist jeweils ein Kommando angegeben, sowie die genaue Uhrzeit, zu der es
ausgeführt werden soll. Die Spalten bedeuten dabei von links nach rechts,
in welcher Minute, Stunde, an welchem Tag des Monats, in welchem Monat und an
welchem Wochentag das Kommando ausgeführt werden soll. Ein Stern
(
*) steht stellvertretend für die Angabe "alle". D.h. das
erste Kommando
/usr/libexec/atrun wird alle 10 Minuten
(
*/10) in jeder Stunde, an jedem Tag des Monats, in jedem Monat und an
jedem Wochentag ausgeführt.
Der zweite Befehl (
/usr/bin/newsyslog) wird hingegen nur zu jeder vollen
Stunde (
0 in der Spalte für die Minuten) ausgeführt.
Diese beiden Kommandos werden mehrfach am Tag ausgeführt, also ist es sinnvoll,
sie weiterhin von
cron aufrufen zu lassen. Die nachfolgenden Befehle
werden allerdings einmal pro Tag (das Skript
/etc/daily) bzw pro
Woche (
/etc/weekly) oder pro Monat (
/etc/monthly)
aufgerufen. Hier ist es sinnvoll, den Aufruf von
anacron vornehmen zu lassen.
Nur so ist bei einem System, das nicht 24 Stunden pro Tag läuft, sichergestellt, daß
diese Skripte regelmäßig ausgeführt werden.
Eine Möglichkeit,
cron am Aufruf dieser Skripte zu hindern, wäre
einfach die entsprechenden Zeilen durch ein Kommentarzeichen zu deaktivieren. Aber die
folgende Lösung ist eleganter und überläßt
anacron nur
dann den Aufruf dieser Befehle, wenn es wirklich installiert ist. Außerdem sollte man
anacron einmal pro Tag von
cron aufrufen lassen - es könnte
ja doch einmal sein, daß der Rechner länger als 24 Stunden durchläuft.
Nach den Änderungen hat die
crontab dann folgendes Aussehen:
#
SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
CRON_WITHIN=7200
#
#minute hour mday month wday command
#
*/10 * * * * /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0 * * * * /usr/bin/newsyslog
#
#
# Einmal taeglich anacron aufrufen
15 3 * * * /usr/pkg/sbin/anacron
#
# do daily/weekly/monthly maintenance
15 3 * * * test -e /usr/pkg/sbin/anacron || /bin/sh /etc/daily 2>&1 | tee /var/log/daily.out | sendmail -t
30 4 * * 6 test -e /usr/pkg/sbin/anacron || /bin/sh /etc/weekly 2>&1 | tee /var/log/weekly.out | sendmail -t
30 5 1 * * test -e /usr/pkg/sbin/anacron || /bin/sh /etc/monthly 2>&1 | tee /var/log/monthly.out | sendmail -t
In diesem Beispiel wird
anacron damit jeden Tag um 03.15 Uhr aufgerufen - natürlich
nur, wenn der Rechner zu dieser Zeit überhaupt läuft.
Wichtig: Die
crontab muß mit einer leeren Zeile enden, sonst wird der Befehl
der letzten Zeile
nicht beachtet!
Weitergehende Erläuterungen zu
cron finden sich z.B. in der guten
Anleitung von Henning Hülsebusch und Ulrich Heilmann unter
http://www.newbie-net.de/anleitung_cron.html
oder natürlich in den Manpages zu
cron und
crontab.
anacron ist nun fast fertig konfiguriert, jetzt gilt es nur noch festzulegen,
welche Befehle von
anacron ausgeführt werden sollen. Dazu dient die
Konfigurationsdatei
/usr/pkg/etc/anacrontab, die (im Gegensatz zu
cron)
mit einem beliebigen Texteditor bearbeitet werden kann.
Vorab ein paar Worte zur Syntax dieser Datei. Sie weicht etwas von der Cron-Syntax ab.
In der ersten Spalte gibt man an, alle wieviel Tage ein Befehl ausgeführt werden soll.
Steht dort beispielsweise eine
1, so wird der Befehl jeden Tag ausgeführt.
Soll das Kommando nur einmal pro Woche ausgeführt werden, so setzt man dort eine
7
Wenn ein System längere Zeit ausgeschaltet war, könnte es sein, daß sehr
viele Kommandos auf einmal ausgeführt werden müssen. Daher kann man in der zweiten
Spalte eine Verzögerung (in Minuten) angeben, die nach dem Aufruf von
anacron
bis zur Ausführung des Kommandos gewartet wird. So kann man beispielsweise bei einem
Befehl
15 eintragen und beim nächsten Befehl
30, und verhindert
auf diese Weise eine zu starke Auslastung des Systems direkt nach dem Booten.
In der dritten Spalte gibt man einen eindeutigen Namen für den jeweiligen Auftrag an,
der weder Leerzeichen noch Schrägstriche (
/) enthalten darf. Danach folgt
dann in der vierten und letzten Spalte schließlich das auszuführende Kommando.
Um die weiter oben beschriebenen System-Wartungsskripte unter NetBSD auszuführen,
könnte die Datei
/usr/pkg/etc/anacrontab damit folgendermaßen
aussehen:
# $NetBSD
#
# anacrontab - Configuration file for NetBSD.
#
# See anacrontab(5) and anacron(8) for more information.
#
SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#days delay id command
1 5 daily /bin/sh /etc/daily 2>&1 | tee /var/log/daily.out | sendmail -t
7 15 weekly /bin/sh /etc/weekly 2>&1 | tee /var/log/weekly.out | sendmail -t
30 30 monthly /bin/sh /etc/monthly 2>&1 | tee /var/log/monthly.out | sendmail -t
Natürlich steht es jedem frei, weitere eigene Aufträge für
anacron
zu erstellen. Um beispielsweise das
in meiner
NetBSD-IMAP-Anleitung
beschriebene Skript
bogo_train jeden Tag aufzurufen, fügt man folgende
Zeile hinzu:
#days delay id command
1 45 bogotrain /usr/local/bin/bogo_train
Damit wird das Skript jeden Tag 45 Minuten nach Systemstart aufgerufen - bzw jede Nacht
um 4.00 Uhr, falls das System durchlaufen sollte.
-> Nach oben
Quellen und weiterführende Links
-> Nach oben