
Kann mir jemand helfen, einen Job auf Crontab einzuplanen, der am 12. jedes Monats ausgeführt wird, und wenn der 12. auf ein Wochenende fällt, sollte er am nächsten Montag ausgeführt werden.
Ich habe etwas im Internet gefunden, aber es funktioniert nicht
0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command
Das ist, was ChatGPT mir gegeben hat. Ich weiß nicht, wie ich das debuggen soll
Antwort1
Meine generelle Empfehlungbesteht darin, dass Sie NICHT versuchen sollten, einen wirklich komplexen Cron-Befehl zu erstellen, wenn Sie Ihren Zeitplan mit der eingeschränkten Syntax von Cron nicht trivial formatieren können.
Als Workaround können Sie einen Zeitplan (etwas) häufiger ausführen als nötig und dann in Ihrem Batch-Job oder einem Wrapper-Shell-Skript, wo Sie eine viel richtere Umgebung haben, wenden Sie die Funktion "Komplex"-Logik, die Sie benötigen. Wenn die Ausführung des Batches zulässig ist, führen Sie den Job aus und beenden Sie ihn andernfalls ordnungsgemäß.
Beispiel
Planen Sie in Cron die Ausführung Ihres Batches über ein Wrapper-Skript, das immer an den Tagen 12, 13 und 14 ausgeführt wird, oder lassen Sie es sogar jeden Tag laufen.
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
25 4 12,13,14 * * /path/to/your/wrapper.script
# or even:
25 4 * * * /path/to/your/wrapper.script
Und dann wenden Sie in diesem Wrapper-Shell-Skript die folgende Logik an:
WENN heute der 12. UND ein Werktag ist : Führen
Sie den Job aus, SONST beenden Sie ihn ordnungsgemäßWENN heute der 13. UND ein Montag ist : (
dann war der 12. ein Sonntag und der Job durfte nicht ausgeführt werden)
führen Sie den Job aus, SONST beenden Sie ihn ordnungsgemäßWENN heute der 14. UND ein Montag ist : (
dann war der 12. ein Samstag und der Job durfte nicht ausgeführt werden)
führen Sie den Job aus, SONST beenden Sie ihn ordnungsgemäß
Ihr /path/to/your/wrapper.script
Bash-Skript könnte dann ungefähr so aussehen:
#!/bin/bash
# Wrapper script that will run_batch() on the 12th when
# the 12th is a weekday, otherwise the following Monday
run_batch () {
# Add the real job here
echo "The job has started"
}
TODAY=$(date +%d)
# date +%u day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)
if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then
run_batch
elif [ "${TODAY}" -eq 13 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
else
exit
fi