rsnapshot: Was ist los mit meiner Crontab?

1

Ich verwende Rsnapshot für Backups (Linux CentOS 6).

Hier ist mein /etc/cron.d/rsnapshot:

30 11 * * * root    /usr/bin/rsnapshot nowandthen > /backups/rsnapshot_cron.txt 2>&1
15 11 * * 4 root    /usr/bin/rsnapshot weekly > /backups/rsnapshot_cron.txt 2>&1
00 11 24-31 * 4 root    /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

Die monatliche Sicherung sollte jeden letzten Donnerstag im Monat durchgeführt werden.

Die monatliche Sicherung wird jedoch heute, Donnerstag, 18.02.2016, um 11:00 Uhr ausgeführt. Heute ist nicht der letzte Donnerstag im Monat.

Was ist los mit meiner Crontab?

Danijel
quelle
Was sehen Sie in Ihren Protokollen?
Jakuje
Ihre Crontab scheint korrekt zu sein. Haben Sie das richtige Datum auf Ihrem Computer? Was ist die Ausgabe von date? Irgendwas relevantes in von grep CRON /var/log/syslog?
Am
Ich kann nicht erklären, warum es am 18. lief, aber denken Sie daran, dass es mehrere crontabDateien gibt: Neben /etcEinträgen gibt es auch eine für jeden Benutzer, einschließlich root. Unabhängig davon wird Ihr Skript nicht das tun, was Sie möchten: Wenn der letzte Tag eines 31-Tage-Monats ein Donnerstag ist, wird er sowohl am 24. als auch am 31. ausgeführt. Wenn der letzte Tag im Februar ein Mittwoch ist, wird er überhaupt nicht ausgeführt.
AFH

Antworten:

3

Laut dieser Site bedeutet Ihre Zeichenfolge "Um 11:00 Uhr am 24., 25., 26., 27., 28., 29., 30. und 31. jedes Monats und jeden Do." (meine Betonung). Wenn die Seite korrekt ist, würde dies erklären, warum sie am 18. lief.

Der Beispieleintrag man 5 crontabfür die Ausführung am 2. Samstag lautet:

0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"

(dh jeden Tag der zweiten Woche ausführen und im Rahmen des Befehls nach dem Wochentag suchen) - Dies unterstützt die Ansicht, dass der Wochentag ein zusätzlicher, alternativer Filter und keine weitere Qualifikation ist, obwohl die Handbuchseite dies nicht schafft klar.

In Ihrem Fall würde ich also Folgendes verwenden:

00 11 * * 4 root test $(date -d @$((`date +\%s`+604800)) +\%m) -ne $(date +\%m) && /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

Überprüfen Sie, ob Ihre dateUnterstützung -d 'next Thursday': Wenn ja, können Sie die eher einfachere verwenden:

00 11 * * 4 root test $(date -d 'next Thu' +\%m) -ne $(date +\%m) && /usr/bin/rsnapshot monthly > /backups/rsnapshot_cron.txt 2>&1

Dies wird jeden Donnerstag ausgeführt und überprüft, ob das Datum in der Woche (604800 Sekunden) ab jetzt im selben Monat liegt. Andernfalls muss es der letzte Donnerstag sein, damit der Sicherungsbefehl ausgeführt wird.

AFH
quelle
Sie müssen Prozentzeichen wie im Beispiel vom 2. Samstag umgehen.
Tripleee
Wenn Sie ein GNU-Datum haben, wird dieses unterstützt, -d "next thursday" +%msodass Sie einen verschachtelten Unterbefehl überspringen können.
Tripleee
@tripleee - Ich habe den Befehl unter bashUbuntu getestet und es war kein Escape-Vorgang erforderlich, obwohl ich ihn nicht eingecheckt habe crontab, da das Testen zu schwierig wäre. Ich kann mir vorstellen, dass dies in einer GNU / Windows-Umgebung notwendig wäre, aber ich werde meine Antwort ändern, da dies keinen Schaden anrichten kann. Danke für den "nächster Donnerstag" -Tipp: Es funktioniert auf Ubuntu, also werde ich es einbauen.
AFH
Das Ausblenden von Prozentzeichen ist eine crontabsyntaktische Anforderung . Also ja, es würde bei der Eingabeaufforderung funktionieren, ohne zu entkommen.
Tripleee
Keine Zeit zum Testen ... Warten auf den nächsten Donnerstag. :)
Danijel