Planen eines Jobs auf Crontab mit benutzerdefiniertem Timing

Planen eines Jobs auf Crontab mit benutzerdefiniertem Timing

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.scriptBash-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

verwandte Informationen