
¿Alguien puede ayudarme a programar un trabajo en crontab que se ejecutará el día 12 de cada mes y si el día 12 cae en fin de semana, debería ejecutarse el lunes siguiente?
Encontré algo en Internet pero no funciona.
0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command
Esto es lo que me dio ChatGPT. No sé cómo depurar este
Respuesta1
Mi recomendación generales que cuando no puedes formatear trivialmente tu programación con la sintaxis limitada que proporciona cron, NO debes intentar crear un comando cron realmente complejo.
Como solución alternativa: ejecute una programación (un poco) con más frecuencia de la que necesita y luego en su trabajo por lotes, o en un script de shell contenedor, donde tenga un entorno mucho más rico, aplique el "complejo" lógica que necesita. Si se permite que el lote se ejecute, ejecute el trabajo y, de lo contrario, salga correctamente.
Ejemplo
En cron, programe su lote para que se ejecute desde un script contenedor que siempre se ejecuta los días 12, 13 y 14 o incluso permita que se ejecute todos los días.
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
25 4 12,13,14 * * /path/to/your/wrapper.script
# or even:
25 4 * * * /path/to/your/wrapper.script
Y luego, en ese script de shell contenedor, aplica la lógica:
SI hoy es el día 12 Y es un día laborable:
ejecute el trabajo, DE LO CONTRARIO salga con graciaSI hoy es el día 13 Y un lunes:
(entonces el día 12 era domingo y no se permitió ejecutar el trabajo)
ejecute el trabajo, DE LO CONTRARIO, salga con graciaSI hoy es el día 14 Y un lunes:
(entonces el día 12 era sábado y no se permitió ejecutar el trabajo)
ejecute el trabajo, DE LO CONTRARIO, salga con gracia
Su /path/to/your/wrapper.script
script bash entonces podría verse así:
#!/bin/bash
# Wrapper script that will run_batch() on the 12th when
# the 12th is a weekday, otherwise the following Monday
run_batch () {
# Add the real job here
echo "The job has started"
}
TODAY=$(date +%d)
# date +%u day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)
if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then
run_batch
elif [ "${TODAY}" -eq 13 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
else
exit
fi