Agendamento de trabalho no crontab com tempo personalizado

Agendamento de trabalho no crontab com tempo personalizado

Alguém pode me ajudar a agendar um trabalho no crontab que será executado no dia 12 de cada mês e se o dia 12 cair nos finais de semana ele deverá ser executado na próxima segunda-feira.

Encontrei algo na Internet, mas não está funcionando

0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command

Isso é o que ChatGPT me deu. Eu não sei como depurar este

Responder1

Minha recomendação geralé que quando você não pode formatar trivialmente sua programação com a sintaxe limitada que o cron fornece, você NÃO deve tentar criar um comando cron realmente complexo.

Como solução alternativa: execute um agendamento (um pouco) com mais frequência do que o necessário e, em seguida, em seu trabalho em lote ou em um script de shell wrapper, onde você tem um ambiente muito mais rico, aplique o "complexo"lógica que você precisa. Se o lote tiver permissão para ser executado, execute o trabalho e saia normalmente.

Exemplo

No cron, agende seu lote para ser executado a partir de um script wrapper que sempre é executado nos dias 12, 13 e 14 ou permite que ele seja executado todos os dias.

# 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

E então, nesse script de shell wrapper, você aplica a lógica:

  • SE hoje for dia 12 E for um dia de semana:
    execute o trabalho ELSE saia normalmente

  • SE hoje for dia 13 E segunda-feira:
    (então dia 12 foi domingo e o trabalho não foi autorizado a ser executado)
    execute o trabalho, ELSE saia normalmente

  • SE hoje for dia 14 E segunda-feira:
    (então o dia 12 foi um sábado e o trabalho não foi autorizado a ser executado)
    execute o trabalho, ELSE saia normalmente

Seu /path/to/your/wrapper.scriptscript bash poderia ser algo assim:

#!/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

informação relacionada