![¿Ejecutar un trabajo cron el primer lunes de cada mes?](https://rvso.com/image/1316111/%C2%BFEjecutar%20un%20trabajo%20cron%20el%20primer%20lunes%20de%20cada%20mes%3F.png)
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 echo
comando 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