Projekt Homeserver im Eigenbau 11: Geplante Aufgaben mit cron

Was auch sehr wichtig ist, sind wiederkehrende Aufgaben. Das ist das, was man unter Windows wohl die Tasks, oder die geplanten aufgaben nennt. Am Server sind sie daher sehr nützlich, da sie immer wiederholte Aufgaben ausführen können, ohne dass ein Administrator etwas dazu tun muss.

Hierfür ist „cron“ zuständig, der die Aufgaben jeweils abarbeitet. Um einen „cron job“ zu erstellen, braucht man eigentlich nur eine Datei editieren, die sogenannte crontab. Jeder Benutzer kann seine eigene Crontab haben, aber weil dies ein Server ist, nutzen wir die systemweite Crontab.

sudo nano /etc/crontab

Damit wäre die Datei offen. Übrigens muss die Crontab mit einem # (Nummernzeichen) enden, oder mit einer Leerzeile. In diesem Falle endet sie mit einem Nummernzeichen.

Geht mit den Pfeiltasten bitte zeilenweise runter, bis ihr zu den Zeilen kommt, die mit „SHELL=“ und „PATH=“ anfangen. Darunter schreibt ihr die Zeile:

MAILTO=root

Wenn es bei der Ausführung der Jobs nun zu Fehlern kommt, erhaltet ihr eine Mail mit dem Inhalt der Fehlermeldung. Ich habe das mal mit einem fehlerhaften Script probiert. Es kommt dann tatsächlich eine Mail mit dem Betreff „cron /home/kamil/fehlerscript.sh“. Im Text steht dann die eigentliche Fehlermeldung. Das war zu erwarten, weil ich im Script absichtlich einen falschen Befehl eingegeben hatte. 🙂

Weiter unten beginnt die Liste mit den einzelnen Jobs. Hier sind auch schon einige Aufgaben eingetragen. Man kann hier recht einfach sehen, welche Struktur jede Zeile haben muss:

  • m: Minuten
  • h: Stunden

Wenn also m und h die Werte 30 10 haben, so wird die Aufgabe um 10:30 Uhr ausgeführt.

  • dom: Tag des Monats, also am wievielten des Monats der Task ausgeführt werden soll.
  • mon: An welchem Monat soll der Task ausgeführt werden
  • dow: Tag der Woche, 1, Montag, bis 7, Sonntag.
  • user: Unter welchem Benutzer soll der Befehl ausgeführt werden?
  • command: Der Befehl, der ausgeführt werden soll.

Die einzelnen Elemente können durch Leerzeichen oder Tabstops voneinander getrennt werden.

Zwei Beispiele

Der NTP-Dienst synchronisiert die Uhrzeit des Systems mit einem Internet-Server, wenn der Server neu gestartet wird. Was ist aber, wenn der Server mehrere Wochen lang läuft? Dann kann man eben einen Cron Job einrichten, der das Problem löst. Ein solcher könnte so aussehen:

30 7    * * 1   root    ntpd -q -g

Dieser Job synchronisiert die Systemzeit jede Woche am Montag um 7:30 Uhr. Der Befehl ntpd -q -g erledigt das. Und der Befehl wird als root, also als Admin, ausgeführt.

Und jetzt kommen wir mal zu einer Besonderheit: Linux setzt die Systemzeit nämlich nur im laufenden Betrieb. Die Hardware-Uhr, die sich auf dem Mainboard befindet und per Batterie weiter betrieben wird, wenn der Rechner aus ist, wird nicht angerührt. Ist diese also falsch, und schaltet man den Rechner ein, startet man den Rechner mit einer falschen Uhrzeit. Das kann, wenn die Differenz zur tatsächlichen Zeit größer als 1000 Sekunden ist, zu Problemen führen. Dann kann es nämlich passieren, dass NTP die Zeit nicht synchronisiert. Jedenfalls habe ich die Informationen, die ich darüber gelesen habe, so verstanden. Daher müssen wir von Zeit zu Zeit auch die Hardware-Uhr nachstellen. Auch dies kann ein Cron Job tun:

31 7    * * 1   root    hwclock --systohc

Wie ihr seht, wird eine Minute nach der Zeitsynchronisation die Hardware-Uhr nachgestellt. Nun brauche ich mich nicht mehr darum kümmern, weil das alles jetzt jeden Montag um 7:30 Uhr passiert.

Übrigens habe ich mir mal die Crontab meines QNAP NAS angesehen. Auch hier befindet sich ein Cron Job, der die Systemzeit jeden Tag sogar in die Hardware-Uhr schreibt. Und noch etwas ist mir dabei aufgefallen. Während ich die S.M.A.R.T. Tests in der Konfigurationsdatei smartd.conf geplant habe, ist hier für jede Platte in der Crontab ein Job hinterlegt. Kann man auch machen, aber ich überlasse das lieber dem smartd-Dienst.

Ausführen von Scripts

Auch das kann man zeitgesteuert machen. Hier mal ein kleines Beispiel. Ich lege ein Script mit der Datei „dateikopieren.sh“ an und schreibe folgendes da rein:

#!/bin/bash
cp /etc/crontab /home/kamil/Server
cp /etc/samba/smb.conf /home/kamil/Server

Dieses Script liegt nun in meinem Home-Verzeichnis. Nun muss es also von Cron nur noch ausgeführt werden. Ich möchte, dass jeden Freitag um 18:00 Uhr diese Dateien gesichert werden. Also lautet die Zeile in crontab wie folgt:

00 18   * * 5   root    /home/kamil/dateikopieren.sh

Fazit

Insbesondere das letzte ist wirklich nur ein Beispiel. Das Script zur Sicherung meiner Konfigurationsdateien führe ich in größeren Abständen selbst aus. Das sollte nur illustrieren, dass, und wie es geht. So kann man auch komplexere Aufgaben zeitlich steuern.

Die beiden Zeilen für die Zeitsynchronisation habe ich tatsächlich so in meiner crontab stehen. Manche machen das öfter, aber ich denke, ein Mal die Woche reicht völlig.

Übrigens ist zu bedenken, dass der Server zum Zeitpunkt der Ausführung laufen muss. Denn cron kann keine Jobs nachholen. Er wird also erst zum nächsten Ausführungstermin wieder ausgeführt.

Falls mir in der Zwischenzeit keine wichtigen Themen mehr einfallen, kommt als nächstes das Einrichten des RAIDs. Und da mir hierzu noch Festplatten fehlen, kann das noch ein Weilchen dauern. Habt etwas Geduld, es geht hier noch weiter. 🙂