Cron permitiu o caractere especial “L” para “Último dia do mês” no Debian

7

Gostaria de saber se L é um dos caracteres especiais permitidos na implementação do cron do Debian? Estou tentando configurar um cron para ser executado no último dia de cada mês.

A partir da entrada do cron na wikipedia :

'L' stands for "last". When used in the day-of-week field, it allows you to specify constructs such as "the last Friday" ("5L") of a given month. In the day-of-month field, it specifies the last day of the month.

Note: L is a non-standard character and exists only in some cron implementations (Quartz java scheduler)

Se não, como você definiria um cron para ser executado no último dia de cada mês? Você recomendaria três entradas diferentes, como esta solução em stackoverflow ?

    
por Jeff 03.09.2013 / 00:12

4 respostas

5

Entradas Cron no Debian são descritas na página man do crontab ( man 5 crontab ). O Debian usa o cron de Vixie, e sua página man diz:

   The crontab syntax does not make it possible  to  define  all  possible
   periods  one could image off. For example, it is not straightforward to
   define the last weekday of a month. If a task needs to be run in a spe-
   cific  period of time that cannot be defined in the crontab syntaxs the
   best approach would be to have the program itself check  the  date  and
   time  information and continue execution only if the period matches the
   desired one.

   If the program itself cannot do the checks then a wrapper script  would
   be required. Useful tools that could be used for date analysis are ncal
   or calendar For example, to run a program the last  Saturday  of  every
   month you could use the following wrapper code:

   0 4 * * Sat   [ "$(date +%e)" = "'ncal | grep $(date +%a | sed  -e 's/.$//') 
     | sed -e 's/^.*\s\([0-9]\+\)\s*$//''" ] && echo "Last Saturday" &&
     program_to_run

Trabalhando assim:

   0 0 * * * perl -MTime::Local -e 
       'exit 1 if (((localtime(time()+60*60*24))[3]) < 2);' || program_to_run
    
por 03.09.2013 / 00:52
3

Eu nunca vi esse L em uma implementação cron do Linux.

Para executar um trabalho no último dia do mês, execute-o em um superconjunto dos dias reais e verifique a data do dia seguinte. Com o GNU date , você pode usar date -d tomorrow para exibir a data do dia seguinte, portanto, verifique se ainda está no mesmo mês. Para evitar problemas em alguns locais em um dia em que o horário de verão começa ou termina, especifique uma hora do dia que não seja as primeiras horas da manhã. Lembre-se que % é especial em um crontab e precisa ser protegido por uma barra invertida.

42 1 28-31 * * if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'tomorrow 12:00 +\%m')" ]; then last_day_of_month_job; fi

Você pode aplicar a mesma técnica para a última ocorrência de um dia específico da semana no mês. Execute o trabalho semanalmente e execute-o somente se a próxima ocorrência estiver em um mês diferente.

42 1 * * 3 if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'now + 7 days 12:00 +\%m')" ]; then last_wednesday_of_month_job; fi
    
por 03.09.2013 / 02:32
2

Meio estranho verificar isso experimentalmente, eu acho, já que isso exigiria mudar o relógio.

O Debian usa a implementação do vixie cron , que é mencionada no artigo da wikipedia. O formato das expressões crontab é explicado em man 5 crontab , o que é um pouco difícil, pois man crontab não é a mesma coisa (a seção padrão 1 é o comando crontab , a seção 5 é para o formato de arquivos "crontab") .

Não menciona 'L'.

WRT as alternativas de S.O., a resposta verificada é a mais fácil de seguir, e não requer um script externo, etc. OTOH, tem uma questão bissexto ...

    
por 03.09.2013 / 00:40
0

Meu script tem esse recurso, não é o cron nativo, mas fará o truque.

link

Exemplos:

# every last sunday
30 6 * * 7 root run-if-today L && /root/myscript.sh

# every third tuesday
30 6 * * 2 root run-if-today 3 && /root/myscript.sh
    
por 29.08.2016 / 17:05

Tags