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

8

Eu tenho uma instalação cron para executar um script bash diariamente às 22:00. Eu tenho outra instalação do cron para executar mensalmente no dia 1º do mês. Ambos 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 desativar o cron diário no primeiro dia do mês para que ambos 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 1º e depois novamente para restaurar as coisas, mas isso parece ... imundo.

SnakeDoc
fonte
nem todos os meses têm 31 dias, isso não causaria um problema?
SnakeDoc 29/08
Não
Stéphane Chazelas
uma boa alternativa para a solução oferecida pelo @suspectus
SnakeDoc
2
ou 2-31 para o campo do dia do mês.
ash
@ash - veja minha resposta, foi exatamente isso que sugeri.
slm

Respostas:

10

De maneira semelhante à solução proposta por @StephaneChazelas nos comentários, você pode especificar o intervalo de dias no terceiro campo como um intervalo para o cron no qual você deseja executar todos os dias, além do 1º do mês.

As duas entradas a seguir realizariam 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
slm
fonte
na verdade, não parece trabalhar para mim (a menos que eu estou fazendo algo errado) - a formatação em comentários é terrível - para ver meu pastbin por favor para o que eu estou ficando: pastebin.com/RKvy5d4e
SnakeDoc
oops, deve ser 0 22 2-31 * * no seu exemplo. eu vou editar.
SnakeDoc
1
@SnakeDoc - graças, todas aquelas colunas começam a se misturar depois de um tempo 8-)
SLM
yup eu esquecê-los também - eu configurá-los, em seguida, esquecer como eu fiz isso (coisa boa para a página man lol)
SnakeDoc
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 1º do mês, chame o programa java com parâmetros mensais, caso contrário, chame o programa com os parâmetros diários.

Alterar o script simplifica o processo, pois o script como documento descreverá melhor o que está acontecendo sem exigir informações adicionais em uma tabela cron.

Os mods de script podem se parecer com isso:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi
suspeito
fonte
1
acabou indo com esta solução. Eu criei outro script bash com seu código de exemplo e, mensalmente - ele inicia o script mensal (que por sua vez alimenta o argumento mensal do programa java subjacente), inicia diariamente o script diário etc.
SnakeDoc
0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Eu acho que usando comparação inteira se mais correto

date '+% d' retorna 01 e não 1, portanto, a comparação de string == será falsa

em vez de

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
Wodel
fonte