Kategorien
linux tutorial

Cron – die Zeitschaltuhr für Linux

tux_sucks.jpgAnfang der Woche konntet ihr hier lesen wie man mit dem Programm ftpmirror ganz einfach seinen Webspace auf den heimischen Computer sichert. Ganz praktisch, aber ein Haken bleibt. Man muss immer noch daran denken das Programm auszuführen. Aber Linux wäre nicht Linux wenn es nicht auch eine Methode gäbe um Programme zeitgesteuert auszuführen. ‚Cron‘ heißt das ganze und die Bedienung werde ich im folgenden etwas erklären:

Cron sollte auf den meisten Linux-/Unix-Systemen bereits vorinstalliert sein. Um zu sehen ob für euren Benutzer bereits irgendwelche geplanten Aufgaben bestehen einfach

crontab -l

auf der Konsole ausführen. Dort sollte eigentlich noch kein Eintrag vorhanden sein, deshalb schauen wir uns mal die crontab des root-Accounts an:

sudo crontab -l

Auch hier gähnende leere? Dann sollten wir das ändern, doch dazu erst ein wenig Theorie:

Im wesentlichen sieht ein Eintrag in die crontab so aus:

[Minuten] [Stunden] [Tage] [Monate] [Wochentage] [Befehl]

Für ein tägliches Starten von ftpmirror um 12 Uhr Mittags würde die Zeile lauten:

0 12 * * * /usr/sbin/ftpmirror paket

Gültige Angaben für die einzelnen Werte sind:

Minuten 0-59 und * für jede Minute
Stunden 0-23 und * für jede Stunde
Tage 1-31 und * für jeden Tag
Monate 1-12 und * für jeden Monat
Wochentage 0-7 und * für jeden Wochentag ( 0 und 7 zählen als Sonntag)

Um die Sache ein wenig zu vereinfachen gibt es auch Aliase:

@reboot einmal nach dem Booten  
@yearly einmal im Jahr (0 0 1 1 *)
@monthly einmal im Monat
(0 0 1 * *)
@weekly einmal in der Woche (0 0 * * 0)
@daily einmal am Tag (0 0 * * *)
@hourly einmal in der Stunde (0 * * * *)

Die Aliase bewirken immer eine Ausführung um 0:00Uhr des gewählten Zeitraumes. Der Alias wird einfach anstatt der Zeitangaben in die crontab eingetragen:

@reboot /usr/sbin/ftpmirror paket

Ausserdem gehen noch folgende Konstellationen:

Kommagetrennt um Programme zum Beispiel um 8 und um 20 Uhr auszuführen:

0 8,20 * * * ...

oder mit Bindestrich um einen Zeitraum anzugeben in dem das Programm ausgeführt wird:

0 8-17 * * * ... Zwischen 8 und 17 Uhr jede Stunde

Oder mit einem Slash (‚/‘) um den Zeitraum einzuteilen:

*/20 8-17 * * * ... Zwischen 8 und 17 Uhr alle 20 Minuten

Ihr seht, eine Menge Möglichkeiten, die uns das gute cron bietet, aber nun zur Tat:

zuerst solltet ihr natürlich ftpmirror einrichten und einmal durchlaufen lassen um zu sehen ob es funktioniert, falls das so ist startet den crontab Editor mit dem folgenden Befehl:

crontab -e Dies sollte den per Standard eingestellten Editor aufrufen, mit einer leeren crontab.

Dort wird dann folgendes eingetragen:
z.B. für ein Backup jeden Tag um 12 Uhr Mittags:

0 12 * * * /usr/sbin/ftpmirror paket

oder ein weiteres Beispiel für eine Ausführung drei mal die Woche um 12 Uhr:

0 12 * * 1,3,5 /usr/sbin/ftpmirror paket | Hier jeden Montag, Mittwoch und Freitag

So im Prinzip war es das schon, das einzige worauf ihr noch achten solltet ist, dass der Rechner auch an ist wenn das Backup laufen soll. Ich hoffe ich konnte ein wenig Klarheit in die Welt der zeitgesteuerten Befehle unter Linux geben. Natürlich kann das ganze mit jedem beliebigen Programm gemacht werden, nicht nur mit ftpmirror. Mehr Informationen erhaltet ihr auf der Konsole eures Vertrauens nach Eingabe von:

man cron
oder
man 1 crontab
oder
man 5 crontab

Da auch ich nicht frei von Fehlern bin, bitte ich darum alle Fehler in diesem Beitrag gnadenlos zu zerpflücken und auszuweiden 😉

11 Antworten auf „Cron – die Zeitschaltuhr für Linux“

Wenn man cronjobs als root (oder als anderer User) ausführen muss, kann man entweder einen Cronjob wie oben beschriebene als entsprechender User erstellen, oder, was evtl. eleganter ist, eine Textdate in /etc/cron.d/ erstellen. Das Format ist wie folgt:
[Minuten] [Stunden] [Tage] [Monate] [Wochentage] [User] [Befehl]

Wenn man diese conjobs jetzt auch noch vernünftig Debuggen will, kann man die MAILTO variable setzen
Einfach MAILTO=Username in eine Zeile bevor den eigentlichen Cronjobs schreiben. (Die Mailutils sollten hierfür installiert sein.)

Außerdem sollten alle Cronjob Files mit einer Leerzeile enden, ist aber optional so weit ich weiß.

Wenn dazu noch ein, zwei „Kleinigkeiten“ machbar wären 😉 Daher frag ich laienhaft mal so ins Blaue:

So eine Art „intelligente“ Backup-Funktion, sprich dass nur veränderte oder neue Dateien geladen werden wäre praktisch. Geht das (mit vernünftigem Aufwand)?
Oder, dass nur X Versionen auf der Platte speichert und dann immer nur die älteste überschrieben wird?

Möchte nur anmerken: Ich frage aus Interesse und nicht aus niedrigen Beweggründen (wie Faulheit) 🙂
Was passiert eigentlich wenn mein PC zur eingestellten Zeit nicht an ist? Wird der Job nach dem nächsten Hochfahren nachgeholt?

Aber das sind nur Kleinigkeiten. Die Idee und die einfache Durchführung ist spitze!

PS: Ich weis, wenn ich die man-Page gelesen hätte bräuchte ich hier nicht so blöd fragen. Aber ich blicke bei diesem Fach-Geek-English sehr schwer bzw. sehr langsam durch 🙁

Ubuntu hat den anacron Daemon, der nicht ausgeführte Cronjobs nachholen.

Wegen der Backups, du suchst eher etwas wie rsync, ein Tool für incrementelle syncronisation. Evtl. wenn man den FTP account als Laufwerk mountet (geht das?) und dann von dort auf einen lokalen Ordner synchen lässt.

Direkt vom Server ein inkrementelles Backup zu machen ist mit ftpmirror leider nicht möglich, mir ist auch im Moment nichts bekannt mit dem man das ohne Root-Zugriff auf den Webserver machen könnte. Meine Lösung wäre, das man einfach die Daten die ftpmirror herunterlädt lokal weiterveraebeitet und danach löscht.
Also so:
ftpmirror->backup
backup->rsync (o.ä.)->inkrementelles backup
backup->/dev/null

Falls der Rechner mal aus ist wird das Backup nicht ausgeführt, klar…Der nächste Lauf des Backups ist dann der nächste geplante Zeitpunkt an dem der Rechner an ist. Umgehen kann man das mit dem von Daniel angesprochenen ‚anachron‘, es sorgt dafür das Programme die ausserhalb der Laufzeit des Computers gestartet werden sollen beim nächsten Start ausgeführt werden…

Ich werd mal schauen ob ich evtl noch etwas vorgefertigtes finde, oder falls ich ein wenig Zeit finde eine Lösung mit rsync zu stricken…

Danke für den Tipps. Zuerst warte ich aber noch ab was Benjamin da grad „strickt“ 🙂
Habe in meinem Linux-Wälzer zu rsync schlau gemacht. Trotz des immensen Funktionsumfanges ist zu 90% (denke ich) folgendes Kommando ausreichend:
# rekursiv für Ordner u. Verz., nur neue u. geänderte Dateien werden kopiert, „-a“ steht für „-rlptgoD“
user$ rsync -a backup/ sync_backup/

#zusätzliche Option löscht im Zielverzeichnis die Dateien die im Quellverzeichnis nicht mehr existieren
--delete
Und wie immer eine Anfängerfrage zum Schluss: Funktioniert im Chrontab eine Weiterleitung zu rsync – wär ja gar zu einfach 😉
#Beispiel
/usr/sbin/ftpmirror paket | rsync -a pfad/zum/backup/ #?
Grüße vom Quälgeist 🙂

PS: „There is one more thing“ 😉 – Es wird doch immer die selbe (einzige!) Sicherung überschrieben. Was ist jedoch wenn das Blog z.B. gehackt wurde? Dann habe ich eine exakte Kopie meines gehackten Blogs, oder? Na ja, etwas Handarbeit muss halt sein.

Du könntest natürlich eine rotation des backup location einbauen, wenn du darauf wert legst. date +%u gibt dir z.B. den Tag der Woche. Jetzt kannst du folgendes machen:
rsync -a backup sync_backup/$( date +$u)/
Die Ordner sync_backup/1/ bis sync_backup/7/ (bzw. 0-6) müssen existieren.

p.s.: Hier ist ein kleines sciprt, das ich für Backups auf meinen USB Stick verwende (keine Rotation): http://dani.tac-ops.net/codepaste/codepaste.php?id=149

@Dpop2003: Kommt darauf an welcher Editor als Standard eingestellt ist. Im Falle von nano wird mit Strg-O gespeichert und mit Strg-X der Editor wieder verlassen.
Falls vim eingestellt ist reicht ein „:wq[Enter]“ (genau so eintippen)

Kommentare sind geschlossen.