¿Cómo hacer que crontab se ejecute los días hábiles 6, 7 y 8 de un mes?

¿Cómo hacer que crontab se ejecute los días hábiles 6, 7 y 8 de un mes?

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

información relacionada