Melhor maneira de garantir que um script seja executado uma vez por período?

5

Eu preciso de um determinado script para ser executado uma vez por mês (outras pessoas que visualizarem essa pergunta podem precisar que ele seja executado uma vez por dia / semana / ano / 5 dias etc.).

Eu sei que posso usar o cron para fazer isso com:

0 0 1 * * ./script.sh

Mas e se a máquina estiver offline durante esse intervalo (desligue no primeiro dia de um mês em particular como exemplo).

Existe uma solução elegante para isso? Ou eu teria que incluir uma sub-rotina nesse script para definir um valor I've-run-this-month-already e, em seguida, outro script executado todos os dias do mês (ou na inicialização) para verificar esse valor?

Atualização:

Preciso que meu script seja executado uma vez por mês no início do mês. Enquanto escrevia um script para realizar várias coisas, criei o código abaixo. Eu só estou colocando aqui caso alguém ache útil depois de encontrar essa pergunta.

# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
        # CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
        echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi

# CREATE A NEW FILE EVERY TIME THIS SCRIPT IS RUN WITH THIS MONTHS DATE
echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/this_month

# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
        # RUN YOUR RELEVANT CODE HERE #
        echo 'date' | awk '{print $2,$6}' > /usr/local/bin/system/old_month     # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
fi
    
por Jim 29.06.2016 / 11:02

2 respostas

10

Você pode usar o Anacron para isso, ele foi projetado para executar tarefas em determinados intervalos sem assumir que o sistema está ativo continuamente. Se um trabalho deve ser executado todos os meses, a Anacron irá verificar se ele foi executado no mês anterior, e executá-lo se não tiver (e lembre-se de que não precisa executá-lo novamente por mais um mês). / p>

Nos derivados do Debian, o Anacron funciona muito bem com o Cron para cuidar de /etc/cron.{daily,weekly,monthly} apropriadamente (então você simplesmente define sua tarefa mensal como uma tarefa mensal em /etc/cron.monthly , e ela será executada apropriadamente).

Em outros sistemas, você definiria sua tarefa mensal em /etc/anacrontab .

    
por 29.06.2016 / 11:09
5

Parece que fcron é a ferramenta certa: "O fcron não faz suposições sobre se o seu sistema está funcionando o tempo todo ou regularmente: você pode, por exemplo, dizer ao fcron para executar tarefas a cada x horas y minutos de tempo de sistema ou faça um trabalho apenas uma vez em um intervalo de tempo especificado. "

    
por 29.06.2016 / 11:10