Me gustaría ejecutar un trabajo de cron a las 8.30 el primer lunes de cada mes. La página cron de Wikipedia dice
Aunque normalmente el trabajo se ejecuta cuando los campos determinados de tiempo / fecha todos coinciden con la hora y fecha actuales, hay una excepción: si ambos "día del mes" y "día de la semana" están restringidos (no "*"), a continuación, ya sea el campo "día del mes" (3) o el campo "día de la semana" (5) deben coincidir con el día actual.
(mi énfasis)
¿Eso significa que no puedo hacer el primer lunes del mes, solo puedo hacer el primer (o lo que sea) día del mes? No puedo pensar en una forma de evitarlo.
Respuestas:
Puede poner la condición en el comando crontab real:
Ahora, si esta condición es cierta en uno de los primeros siete días de un mes, tiene su primer lunes. Tenga en cuenta que en el crontab, el porcentaje de sintaxis debe ser escapado:
Reemplace el
echo
comando con el comando real que desea ejecutar. También encontré un enfoque similar .fuente
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
igual que[ $(date '+%a') = "Mon" ] && echo "It's Monday"
Pero, en el crontab parece estar fallando en esta prueba. No puedo obtener ningún comentario útil de cron tampoco: estoy tratando[ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1
de capturar cualquier salida de error en un registro, pero eso tampoco funciona: /date
salida es correcta? Por ejemplo, simplemente dejecron
que se ejecute un comando que muestre esto en un archivo:date '+%a' > ~/datetest 2>&1
- luego verifique si eso resultó en la cadena correcta para comparar.+%a
necesario escapar cuando estaba en el crontab, es decir, la línea tenía que ser la siguiente:[ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
. Si pudiera actualizar su respuesta con eso, sería útil para futuros lectores :) Gracias de nuevo - maxTengo una computadora con configuración regional en español, por lo que este enfoque no funciona para mí porque mon cambia a lun
Otros idiomas también fallarían, así que hice una ligera variación en la respuesta aceptada que elimina la barrera del idioma:
fuente
Me resulta más fácil cuando no hay necesidad de manejar los números de día.
Ejecutar primer lunes de mes:
es decir, si el mes de hace 1 semana no es el mismo que el mes actual, estamos en el primer día 1 (= lunes) del mes.
Del mismo modo, para el tercer viernes
es decir, si el mes hace 3 semanas es diferente al mes actual, entonces estamos en el tercer día 6 (= viernes) del mes
fuente
He programado un trabajo para que se ejecute el cuarto lunes de cada mes a las 4:00 p.m. de la siguiente manera:
fuente
Por lo que sé, NO es posible usar solo crontab, sin embargo, se puede usar una función de contenedor para elegir el día correcto de una entrada de contacto de los "primeros siete días del mes"; mira esto desde la entrada.
El script de envoltura sería
y necesitaría ejecutarlo (asumiendo que se llama wrapper.sh y está disponible globalmente) usando la entrada crontab
fuente
En Solaris 10 tuve que formatear la condición de la siguiente manera:
fuente
Puede intentar ejecutar cronjob durante los primeros siete días del mes y dejar que se ejecute solo el lunes.
Arriba debería funcionar para usted.
fuente
Recomiendo usar
en lugar de
para evitar problemas locales.
fuente
Hice una solución general para este tipo de problemas, funciona para el primer, segundo, tercer ..... último día de la semana del mes.
Puedes usarlo así:
La secuencia de comandos run-if-today verifica tanto el día de la semana como el intervalo de fechas deseado de la semana, si ambos coinciden, devuelve 0, de lo contrario 1.
Consulta el código aquí. https://github.com/xr09/cron-last-sunday
fuente
Creo que esto resuelve el problema con más elegancia:
fuente
Como interpreto mis declaraciones cron usando php y js, no puedo usar bash. Finalmente encontré que es de hecho posible con sólo cron:
Espero que esto ayude a alguien más. De todos modos, les deseo a todos un hermoso día. :-)
fuente
Esto funcionará todos los lunes de cada mes.
fuente