Cron para rodar a cada segunda quarta-feira?


9

Preciso encontrar uma maneira de agendar um trabalho para que ele seja executado a cada segunda quarta-feira do mês. Isso é possível?

linux  cron 

1
Esta pergunta parece fornecer uma resposta apropriada.
scurker

1
Sim, mas essa pergunta é sobre ter, não qua;) A resposta aceita é inteligente, no entanto.
edoloughlin

>> Sim, mas essa pergunta é sobre ter, não qua;) A resposta aceita é inteligente, no entanto ... o que é tão difícil mudar de ter para qua?
precisa

0 * * * 3 teste $ (data \ +% u) -eq 3 && echo "start run me" tente isso. não colou na resposta porque uma pergunta básica é bastante vaga.

Respostas:


14

Minha página de manual do crontab (que infelizmente não consigo encontrar on-line) fornece o seguinte exemplo:

# Run on every second Saturday of the month
0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"

Adaptando isso aos seus propósitos ...

0 4 8-14 * *    test $(date +\%u) -eq 3 && job.sh

3
Para quem deseja editar esta resposta, o motivo pelo qual você não usa apenas o campo dia da semana é que, se o dia do mês e o dia da semana forem restritos (por exemplo, não são *), o comando será executado quando um deles corresponder .
Hasturkun


1
Eu descobri que eu tinha de escapar da% u, então:date +\%u
Antony D'Andrea

3

Você pode evitar a execução de um script externo usando uma combinação do truque do dia da semana mais o dia da semana:

# Run on every second Wednesday of the month
0 4 8-14 * Wed job.sh

Isso também evita a execução de outro programa externo. O 8-14 seleciona todos os dias que correspondem à segunda semana do mês. Em seguida, filtra apenas nessa quarta-feira.


1

Não é possível usar o cron por conta própria, mas você pode chamar um script uma vez por semana que faz o teste:

No crontab, execute second_wed.sh às 12h toda quarta-feira:

0 12 * * 3 /home/you/bin/second_wed.sh

Em second_wed.sh:

#!/usr/bin/env bash
day_of_month=`date +"%
if [ $day_of_month -gt 7 -a $day_of_month -lt 15 ]; then
  # Call your program here instead of 'ls'…
  ls
fi

1

Com base nesta resposta, você pode fazer:

00 12 * * Wed expr `date +\%d` \> 7 \& `date +\%d` \< 15 >/dev/null && runJob.sh

1

Para servidores CentOS 7, essa parece ser a sintaxe que funciona para mim. Observe os espaços ao redor do [e ]. Demorou um pouco para eu descobrir.

Isso executa o test.sharquivo às 13:07 / 13:07 na segunda quarta-feira do mês. (0 = domingo, 1 = segunda-feira, 2 = terça-feira, 3 = quarta-feira etc.)

07 13 8-14 * * [ `date +\%u` = 3 ] &&  /root/scripts/test.sh

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.