Wie kann man Crontab dazu bringen, am 6., 7. und 8. Werktag eines Monats auszuführen?

Wie kann man Crontab dazu bringen, am 6., 7. und 8. Werktag eines Monats auszuführen?

Ich erstelle einen Cron-Ausdruck, der nur an einer Reihe von Werktagen alle 30 Minuten ausgeführt werden muss, z. B. am 6., 7. und 8. Werktag eines Monats.

Derzeit habe ich einen Cron-Ausdruck, der jedoch nur am 6., 7. und 8. Tag des Monats ausgeführt wird, unabhängig davon, ob es ein Werktag ist oder nicht.

Aktueller Cron-Ausdruck:

0 0/30 * 6-8 * ?

Ich habe versucht, den Ausdruck für den nächsten Werktag zu verwenden

0 0/30 * 6W * ?

Aber es funktioniert nicht für einen Zeitraum von Tagen - wie von6W-8W.

Wir sind für jede Hilfe diesbezüglich sehr dankbar.

PS: Ich möchte es nicht mit einem Skript machen.

Antwort1

Hm.. Nein, das geht nicht. Es gibt keine Möglichkeit, einen Bereich von Werktagen in einem einzigen Cron-Ausdruck anzugeben. Cron-Ausdrücke sind auf die Angabe fester Daten oder Intervalle für die Felder „Tag des Monats“ und „Wochentag“ beschränkt.

Eine Lösung wäre, drei separate Cron-Jobs zu erstellen, einen für jeden Werktag, an dem Sie den Befehl ausführen möchten, wie folgt:

# for the 6th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 5 business day") = "Mon" ] && /path/to/your/command

# for the 7th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 6 business day") = "Tue" ] && /path/to/your/command

# for the 8th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 7 business day") = "Wed" ] && /path/to/your/command

Antwort2

Das können Sie nicht (oder zumindest bin ich nicht schlau genug, um zu wissen, wie).

Es gibt Einschränkungen in der Crontab, die es Ihnen ermöglichen, auszuwählenMonatstagUndWochentag.

Alle Werktage wären Wochentage 1-5, aber das reicht nicht, weil Sie zählen oder ausdrücken müssen

6., 7., 8. Tag von (Wochentage: 1-5) in diesem Monat

Sie benötigen also ein Skript.

$ cat /home/jaroslav/tmp/workday-567.sh
#!/bin/bash

jan01() { date +%s -d `date +%Y-01-01`; }
december() { echo $(($(jan01) + 365*24*3600)); }
day=`jan01`; december=`december`; 
today=${1:-$(date '+%Y-%m-%d')}

this_months_678th=$(
while [ $day -lt $december ];do
    date '+%Y-%m-%d %B %A %u' -d@$day;
    let day=$day+86400; 
done  |
sort -u |
sed -e "/[67]$/d; /$(date '+%Y-%m')/!d" |
sed -n -e '6p; 7p; 8p'
)

if echo -e "$this_months_678th" | grep -q $today; then
    exit 0
fi
exit 1

November 2018;

$ for i in 2018-11-{01..31}; 
    do bash /home/jaroslav/tmp/workday-567.sh $i && echo run on $i;
  done 
run on 2018-11-08
run on 2018-11-09
run on 2018-11-12

verwandte Informationen