Cronjob para executar o script a cada 3 semanas na quarta-feira

6

É possível agendar um cron job que seria executado a cada três semanas somente na quarta-feira (8AM)? Ou, se isso não for possível, executar um trabalho a cada 27 dias ou menos, mas na quarta-feira às 8h.

    
por Ram 22.07.2014 / 21:27

3 respostas

4

Execute o seguinte script toda quarta-feira:

[ -f /path/to/timestamp ] && \
  [ 'date +%s' -lt $(($(cat /path/to/timestamp)+20*86400)) ] || \
  { date +%s > /path/to/timestamp; your_command; }

onde /path/to/timestamp é um nome de caminho arbitrário (que não existe inicialmente), normalmente em algum lugar no diretório pessoal do usuário (para evitar ataques de links simbólicos, não use um diretório onde outros usuários possam gravar). Este script funciona da seguinte maneira:

  1. Se esse nome de caminho ainda não existe, então o criamos com a data atual como seu conteúdo e nós executamos o comando. A data é representada pelo número de segundos desde que alguma origem chamou a época.
  2. Se esse nome de caminho existir (nesse caso, é assumido que ele foi criado por esse script), ele especifica a data em que o comando foi executado pela última vez. Adicionamos 20 dias (20 * 86400 segundos) a essa data e comparamos o resultado com a data atual. Se pelo menos 20 dias se passaram, atualizamos o conteúdo do nome do caminho com a data atual e executamos o comando.

Como este script é executado toda quarta-feira (às 8:00) via cron, o comando será executado a cada 3 semanas (como após 1 ou 2 semanas, 20 dias ainda não passaram).

Observe que essa solução funciona mesmo se a máquina for desligada antes da terceira quarta-feira. Se, por algum motivo, a máquina for desligada na terceira quarta-feira, o comando será executado na próxima quarta-feira em que a máquina estiver ligada (a pergunta é necessária para executar o comando apenas na quarta-feira às 8h).

    
por 22.07.2014 / 22:46
2

Se você usa o GNU / Linux e crond do dillon (procure por um pacote chamado dcron para sua distribuição), você pode usar a sintaxe mais detalhada do crontab, como explicado em man 1 crontab

0 8 * * wed ID=job1 FREQ=20d your_job

Isso executará your_job na quarta-feira, às 8 horas, se pelo menos 20 dias tiverem decorrido desde a última execução.

    
por 22.07.2014 / 21:56
2

Se você já tem um cron que não é dcron e não quer mudá-lo, você pode usar este cron job:

0 8 * * wed  n=0 && [[ -e /home/user/.cronjob && -r /home/user/cronjob ]] && read n < /home/user/.cronjob ; [[ $n == 0 ]] && your_actual_job ; echo $(( (n+1) \% 3 )) > /home/user/.cronjob

Isso fará uma espécie de escrituração. Toda quarta-feira, o cron job será executado. Ele buscará o valor escrito em .cronjob , que pode ser 0, 1 ou 2. Se for 0, o trabalho real será executado. Então, o valor é incrementado no módulo 3 e escrito de volta para .cronjob .

Observe o '\' antes do '%'. Isso é necessário porque o cron interpreta '%' de uma maneira especial.

    
por 23.07.2014 / 08:55

Tags