¿Ejecutar un trabajo cron el primer lunes de cada mes?

¿Ejecutar un trabajo cron el primer lunes de cada mes?

Me gustaría ejecutar un trabajo desde cron a las 8:30 el primer lunes de cada mes. La página de Wikipedia de cron dice

Si bien normalmente el trabajo se ejecuta cuando todos los campos de especificación de fecha y hora coinciden con la fecha y hora actuales, hay una excepción: si tanto el "día del mes" como el "día de la semana" están restringidos (no "*"), entoncescualquierael campo "día del mes" (3) o el campo "día de la semana" (5) deben coincidir con el día actual.

(énfasis mío)

¿Eso significa que no puedo hacerlo el primer lunes del mes, solo puedo hacerlo el primer (o cualquier) día del mes? No se me ocurre ninguna manera de evitarlo.

Respuesta1

Puede poner la condición en el comando crontab real (forma genérica):

[ "$(date '+%u')" = "1" ] && echo "It's Monday"

Si su configuración regional es EN/US, también puede comparar cadenas (respuesta inicial):

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

Ahora bien, si esta condición se cumple en uno de los primeros siete días de un mes, tienes su primer lunes. Tenga en cuenta que en el crontab, es necesario escapar la sintaxis de porcentaje (forma genérica):

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "It's Monday"

Si su configuración regional es EN/US, también puede comparar cadenas (respuesta inicial):

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

Reemplace el echocomando con el comando real que desea ejecutar. Encontre unenfoque similartambién.

Respuesta2

Tengo una computadora con configuración regional en español, por lo que este enfoque no me funciona porqueluncambios aluna

Otros idiomas también fallarían, así que hice una ligera variación de la respuesta aceptada que elimina la barrera del idioma:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

Respuesta3

Me resulta más fácil cuando no es necesario manejar números de días.

Ejecutar el primer lunes del mes:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

es decir, si el mes de hace 1 semana no es el mismo que el mes actual, entonces estamos en el primer día 1 (= lunes) del mes.

Del mismo modo, para el tercer viernes

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

es decir, si el mes de hace 3 semanas es diferente al mes actual, entonces estamos en el tercer día 6 (= viernes) del mes.

Respuesta4

He programado un trabajo para que se ejecute el cuarto lunes de cada mes a las 4:00 p.m. de la siguiente manera:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

información relacionada