Cron para não ser executado no dia específico, mas em todos os outros dias

8

Eu tenho uma configuração do cron para executar um script bash diariamente às 22h. Eu tenho outra configuração de cron para executar mensalmente no primeiro dia do mês. Os crons iniciam um script bash, e o único diferente no script bash é o argumento que eles passam para o programa java subjacente (emulando o lançamento da linha de comando do programa java).

O problema é que, de alguma forma, preciso desabilitar o cron diário no primeiro dia do mês para que os dois não tentem executar no mesmo dia. Isso é possível fazer automaticamente?

Suponho que posso criar outro script bash para editar o cron antes do primeiro e depois novamente para restaurar as coisas, mas isso parece ... impuro.

    
por SnakeDoc 30.08.2013 / 00:12

3 respostas

9

No mesmo sentido da solução proposta por @StephaneChazelas nos comentários, você poderia especificar o intervalo de dias no 3º campo como um intervalo para o cron que você deseja executar todos os dias, além do primeiro dia do mês. / p>

As duas entradas a seguir realizam o que você procura:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash
    
por 30.08.2013 / 01:28
8

A maneira mais fácil de lidar com isso é apenas ter uma entrada no cron. Modifique o script bash para verificar a data - se for o primeiro dia do mês, chame o programa java com parâmetros mensais, ou chame o programa com os parâmetros diários.

A alteração do script torna o processo mais simples, pois o script como um documento descreverá melhor o que está acontecendo sem exigir informações adicionais em uma tabela cron.

Os mods de script podem ser parecidos com este: -

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
    
por 30.08.2013 / 00:17
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Acho que usar a comparação de números inteiros se for mais correto

date '+% d' retorna 01 não 1 assim usando == comparação de strings será falsa

em vez

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
    
por 22.09.2014 / 14:25