Jeder, der einen Linux-Server betriebt, wird früher oder später auch cron
-Jobs verwenden.
Auf die cron
-Jobs selber möchte ich hier aber nicht weiter eingehen. Das ist auf vielen Seiten im WWW sehr schön und ausführlich erklärt. Da braucht es nicht noch eine Seite mit dem gleichen Inhalt.
Hier möchte ich einen cron
-Job erklären, der nicht standardmäßig mit der Cron
-Syntax zu erledigen ist: Es soll ein Befehl jeden ersten Freitag in jedem Monat ausgeführt werden.
Zuerst eine kleine Erklärung zum Aufbau der Zeitangaben eines cron
-Jobs:
Die cron
-Syntax besteht aus 5 Zeitangaben:
Minuten – Stunden – Tage – Monate – Wochentage
Tage: sind die Tage eines Monats (1..31)
Wochentage: sind Mo-So (0..7 – wobei 0 und 7 jeweils für Sonntag gelten)
Möchte man jetzt jeden ersten Freitag um 20:15 einen Job ausführen, so läge es nah folgende Syntax zu verwenden:
1 |
15 20 1-7 * 5 user Befehl |
Doch das funktioniert leider nicht, denn die Angaben für Tage und Wochentage sind sozusagen eine Oder-Verknüpfung.
Das Beispiel würde bedeuten:
„Führe aus an: Minuten UND Stunden UND (Tage ODER Wochentage) UND Monate.“
Der obige cron
-Job würde also an den ersten sieben Tagen und jeden weiteren Freitag in jedem Monat um 20:15Uhr ausgeführt.
Bei der Anforderung „jeden ersten Freitag im Monat“ kommt man um einen weiteren Befehl nicht herum.
Ich löse das Problem erst mal mit einer Bash-Datei, weiter unten seht Ihr eine Lösung, welche in eine Zeile passt und somit auch ohne Bash-Datei zum Erfolg führt.
Zuerst die cron
-Syntax in der Crontab
1 |
15 20 1-7 * * root /Pfadzur/Freitag.sh |
Dann erzeugen wir eine Datei namens Freitag.sh und gebe ihr folgenden Inhalt
1 2 3 4 5 6 7 |
#/bin/bash #Abfragen das aktuellen Wochentags aus dem date-Befehl #Zerlegen des date-Strings und ausgeben der date-Variable „%w“ (Wochentagnummer 5 = Freitag) if [ "$(date +%w)" = "5" ]; then fi exit 0 |
In diesem Fall würde der cron
-Job an den ersten sieben Tagen eines Monats gestartet, aber der Befehl in der Freitag.sh nur an einen Freitag ausgeführt.
Die lange Variante ist leichter zu erklären/verstehen, aber wie versprochen kommt hier jetzt noch die Kurzform.
Diese kann direkt in die crontab
eingegeben werden.
1 |
15 20 1-7 * * root [„$(date +%u)" = "5"] && <auszuführender befehl=""> |
Das Doppel-Und (&&) ist wichtig.
Zwar wird ein Befehl auch mit einem einzelnen „&“ verkettet, aber es gibt einen kleinen Unterschied:
Einfaches „&“ :
Der nachfolgende Befehl wird ausgeführt
Doppeltes „&&“ :
Der nachfolgende Befehl wird nur ausgeführt, wenn der vorhergehende Befehl erfolgreich abgearbeitet wurde.
Würde hier nur ein einfaches „&“ verwendet, würde der nachfolgende Befehl immer ausgeführt werden – egal ob die Abfrage auf den Wochentag „Freitag“ stimmen würde oder nicht.