Executa um cron job na primeira segunda-feira de cada mês?

28

Gostaria de fazer um trabalho no cron às 8.30 na primeira segunda-feira de cada mês. A página Wikipedia do cron diz

While normally the job is executed when the time/date specification fields all match the current time and date, there is one exception: if both "day of month" and "day of week" are restricted (not "*"), then either the "day of month" field (3) or the "day of week" field (5) must match the current day.

(minha ênfase)

Isso significa que não posso fazer a primeira segunda-feira do mês? Só posso fazer o primeiro (ou qualquer outro) dia do mês? Eu não consigo pensar em uma maneira de contornar isso.

    
por Max Williams 25.05.2012 / 16:56

11 respostas

34

Você pode colocar a condição no comando crontab:

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

Agora, se essa condição for verdadeira em um dos primeiros sete dias do mês, você terá sua primeira segunda-feira. Note que no crontab, a sintaxe de porcentagem precisa ser escapada:

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

Substitua o comando echo pelo comando real que você deseja executar. Eu encontrei um semelhante abordagem também.

    
por 28.05.2012 / 11:02
6

Acho mais fácil quando não há necessidade de lidar com números de dias.

Executar a primeira segunda-feira do mês:

0 2 * * 1 [ 'date '+\%m'' == 'date '+\%m' -d "1 week ago"' ] || /path/to/command

i.e. Se o mês 1 semana atrás não é o mesmo do mês atual, então estamos no 1º dia 1 (= segunda-feira) do mês.

Da mesma forma, para a terceira sexta-feira

0 2 * * 6 [ 'date '+\%m'' == 'date '+\%m' -d "3 weeks ago"' ] || /path/to/command

i.e. se o mês há 3 semanas for diferente do mês atual, então estamos no terceiro dia 6 (= sexta-feira) do mês

    
por 06.08.2015 / 10:12
4

Eu agendei um trabalho para ser executado na quarta segunda-feira de cada mês às 16:00 da seguinte maneira:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt
    
por 18.01.2013 / 09:06
4

Eu tenho um computador com localidade em espanhol, portanto, essa abordagem não funciona para mim porque mon é alterado para lun

Outros idiomas também falhariam, por isso, fiz uma pequena variação na resposta aceita que elimina a barreira do idioma:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"
    
por 25.10.2018 / 01:58
1

Tanto quanto eu sei, NÃO é possível usar apenas crontab, no entanto, pode-se usar uma função wrapper para escolher o dia correto a partir de uma entrada contab "primeiros sete dias do mês"; veja este da entrada.

O script do wrapper seria

#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
   exec somecommand
fi
exit 1

e você precisaria executá-lo (assumindo que ele é chamado wrapper.sh e disponível globalmente) usando a entrada crontab

0 0 * * 1 wrapper.sh
    
por 25.05.2012 / 17:08
1

Você pode tentar executar o cronjob nos primeiros sete dias do mês e deixá-lo executar somente na segunda-feira.

30 8 * * 1 ['date +\%d' -le 07] && <job>

Acima deve funcionar para você.

    
por 21.10.2015 / 15:24
0

Eu fiz uma solução geral para esse tipo de problema, ele funciona para o primeiro, segundo, terceiro ..... último dia da semana do mês.

Você pode usá-lo assim:

30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"

O script run-if-today verifica tanto o dia da semana quanto o intervalo de datas da semana desejado, se ambos corresponderem, retornará 0, caso contrário, 1.

Verifique o código aqui. link

    
por 04.03.2014 / 16:40
0

Acredito que isso resolve o problema de maneira mais elegante:

30 8 1-7 * 1 /run/your/job.sh
    
por 08.07.2014 / 15:26
0

No Solaris 10, tive que formatar a condição da seguinte forma:

[ 'date +\%a' = "Sat" ] && echo "It's Saturday"
    
por 02.10.2015 / 17:25
0

Como interpreto minhas instruções cron usando php e js, não posso usar o bash. Finalmente, descobri que é possível com apenas o cron:

0 30 8 * 1/1 MON#1

Espero que isso ajude alguém. Independentemente disso, desejo a todos um lindo dia. : -)

    
por 09.08.2018 / 13:14
0
0 9 1-7 * 1 * 

Isso funcionará para todas as segundas-feiras de todos os meses.

    
por 04.09.2018 / 11:01

Tags