Como agendar um cronograma quinzenal?

10

O crontab (5) define os seguintes campos:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

e explica:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Portanto, não há trabalhos quinzenais, no que diz respeito ao meu entendimento. Tenho certeza de que existem soluções alternativas, quais são as suas? Ou eu perdi alguma coisa?

romano
fonte
2
A melhor resposta que posso encontrar sobre isso está aqui: unix.stackexchange.com/questions/1224/…
Somantra 3/12/12
... e essas respostas sobre L & L seria a maneira que eu faria isso, @Somantra :-)
voretaq7
@ voretaq7, eu teria dito que era a resposta canônica, mas eu não queria vir transversalmente como pedante ;-)
Somantra

Respostas:

8

Você pode executar o cron todas as quartas-feiras e depois decidir se é uma semana par ou uma semana ímpar. por exemplo:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi
ensopado
fonte
Esta é uma boa solução, no entanto, realmente não responde à pergunta em si - eu preferiria não manchar a coisa com a lógica de programação. Talvez eu possa integrar isso com o link que a @Somantra deu.
Roman
Tudo bem, devo admitir: esta é a melhor solução até agora. O link que o @Somantra forneceu obtém os mesmos resultados IMHO desnecessariamente complexos (contando com o tempo do UNIX), mas adicionar sua abordagem diretamente ao cronjob (em vez de ao script) no mesmo estilo o torna bastante elegante.
Roman
Isso quebra no ano de 2020, porque tem 53 semanas. Ex: se seu cron estava programado para ser bi-semanal em 31 de dezembro, seria executado em 31 de dezembro de 2020 (53ª semana) e 4 de janeiro de 2020 (1ª semana).
23818 maddfox
4

Muitos crons (você não especificou qual você está usando) suportam intervalos. Então, algo como

0 0 1-7,15-21 * 3

Atingiria a primeira e terceira quartas-feiras do mês.

quadruplebucky
fonte
isso é um pouco mais elegante que o método "faça isso no script", mas lembre-se de adicionar um comentário ao seu crontab (regra geral: se você tiver mais de um -ou /envolvido, provavelmente vale a pena comentar para descrever a programação)
voretaq7
Eu suspeito que isso esteja errado; fará com que o trabalho seja executado nos dias 1 a 7 e 15 a 21 de cada mês e também toda quarta-feira. Isto de man 5 crontab: " O dia da execução de um comando pode ser especificado por dois campos - dia do mês e dia da semana. Se os dois campos forem restritos (por exemplo, não são *), o comando será executado quando um dos campos corresponder ao Por exemplo, "30 4 1,15 * 5" faria com que um comando fosse executado às 4h30 do dia 1 e 15 de cada mês, além de toda sexta-feira "(grifo meu).
21914 MadHatter
1
Na verdade, isso depende de qual cron daemon você está usando. Sua entrada parece ser de vixie cron (incluída nas distros do RedHat). De "man crontab" no cron de dillo (Slackware): se você especificar um dia no mês e um dia da semana, * será interpretado como o enésimo dia desse mês no mês *. Ainda assim, uma solução com script (calculando o número da semana) se parece com a única solução portátil.
precisa saber é o seguinte
2

Para algo que precisa ser executado a cada duas semanas, use esta lista:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Esse script específico está programado para ser executado às sextas-feiras. A semana a ser executada pode ser ajustada usando "-eq 0" ou "-eq 1"

AlexY
fonte
1

O Anacron é uma boa solução alternativa para as limitações do cron.

  • O Anacron possui um parâmetro Período de recorrência que pode ser definido como 14.

comando de identificação de tarefa com atraso de período

14 15 test.daily /path/to/script.sh

Somantra
fonte
Infelizmente, o anacron não pode ser usado. Esqueci de mencionar isso.
Roman
1

Se suas necessidades não forem literalmente quinzenais, você poderá simplesmente executar o cronjob nos dias 1 e 15 do mês:

15 8 1,15 * * /your/script.sh

Que funciona às 8h15 no primeiro e no décimo quinto de cada mês, independentemente do dia da semana.

Chris Brewer
fonte
-2

A partir dessa explicação, a configuração 3/2 no campo da semana deve executar a tarefa em todas as quartas-feiras - está implícita, mas acho que é possível.

Journeyman Geek
fonte
não, isso é equivalente a for(int i=3; i <=3 ; i+=2) {} uma vez que só está passando por isso uma vez, não importa se o "passo" é 1 ou 2.
ensopado de
O que @stew disse. Além disso, não há "campo da semana".
Roman
Por campo de semana, refiro-me ao campo "Dia da semana"
Journeyman Geek 4/12