Estoy creando una expresión cron que debe ejecutarse cada 30 minutos solo en un rango de días hábiles, por ejemplo: sexto, séptimo y octavo días hábiles de un mes.
Actualmente tengo una expresión cron, pero solo se ejecuta los días 6, 7 y 8 del mes, independientemente de si es día hábil o no.
Expresión cron actual:
0 0/30 * 6-8 * ?
Intenté usar la expresión del día hábil más cercano.
0 0/30 * 6W * ?
Pero no funciona durante varios días, como desde6W-8W.
Cualquier ayuda a este respecto es muy apreciada.
PD: No busco hacerlo usando un script.
Respuesta1
Hm... No, no puedes. No hay forma de especificar un rango de días hábiles en una sola expresión cron. Las expresiones cron se limitan a especificar fechas o intervalos fijos para los campos de día del mes y día de la semana.
Una solución sería crear tres trabajos cron separados, uno para cada día hábil en el que desee ejecutar el comando, como este:
# 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
Respuesta2
No puedes (o al menos no soy lo suficientemente inteligente para ver cómo).
Hay restricciones en el crontab que le permiten elegirdia del mesydía de la semana.
Todos los días hábiles serían los días de la semana 1 a 5, pero eso no es suficiente porque necesita contar o expresar
6.º, 7.º, 8.º día de (días de la semana: 1-5) de este mes
Entonces necesitas un guión.
$ 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
noviembre de 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