Programación de trabajo en crontab con sincronización personalizada

Programación de trabajo en crontab con sincronización personalizada

¿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 gracia

  • SI 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 gracia

  • SI 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.scriptscript 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

información relacionada