Execute um cronjob todos os dias, exceto o primeiro dia do mês

2

Estou tentando:

  1. executar o trabalho A no primeiro dia do mês: 0 0 1 * *
  2. executar o job B nos outros dias do mês: 0 0 2-31 *?

Vixie cron no Ubuntu 14.02 LTS recusa a segunda sintaxe, embora pareça válida de acordo com Wikipedia e as especificações oficiais:

"crontab", The Open Group Base Specifications Issue 7 — IEEE Std 1003.1, 2013 Edition, The Open Group, 2013, retrieved May 18, 2015

De acordo com as referências acima, a sintaxe 0 0 2-31 * * executaria o trabalho todos os dias do mês, já que o terceiro e quinto campos são tratados como cláusulas OR da condição de execução.

    
por Marco Marsala 16.09.2016 / 15:14

3 respostas

8

Você deve usar um * , não um ? (que é inválido).

A página da Wikipedia observa que ? é uma extensão fora do padrão usada apenas pelo nnCron , que você não está usando.

Em qualquer caso, se o dia da semana estiver definido como * e o dia do mês for especificado, o dia da semana será ignorado. A especificação IEEE 1003.1 que você faz referência afirma isso, , explicando como esses campos interagem:

If either the month or day of month is specified as an element or list, but the day of week is an <asterisk>, the month and day of month fields shall specify the days that match. If both month and day of month are specified as an <asterisk>, but day of week is an element or list, then only the specified days of the week match. Finally, if either the month or day of month is specified as an element or list, and the day of week is also specified as an element or list, then any day matching either the month and day of month, or the day of week, shall be matched.

Portanto, o formato correto é exatamente o mais lógico:

0 0 1 * * echo First of the month
0 0 2-31 * * echo Not the first of the month
    
por 18.09.2016 / 20:52
3

Você pode usar a data:

0 0 * * * [ $(date +\%d) -eq 1 ] && echo I will run on the 1st
0 0 * * * [ $(date +\%d) -ne 1 ] && echo I will run on all other days
    
por 16.09.2016 / 15:18
0

Se o seu crond não permitir que você especifique as datas diferentes, envolva um pequeno script de shell em torno dos seus scripts.

#!/bin/bash
if [[ 'date +%d' -eq 01  ]]
        then
                /path/to/script_a
        else
                /path/to/script_b
fi

Execute o script todos os dias e deixe que ele decida quais scripts serão executados.

    
por 16.09.2016 / 15:56

Tags