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