Excluindo data e hora específicas no cronjob

1

Estou tentando agendar um trabalho do cron onde a exigência é que o trabalho tenha que ser executado todos os dias, todos os meses e todas as min e todas as horas, EXCETO 2o e 4o domingo de cada mês, das 1 às 3 horas.

Existe uma maneira de fazer isso? Eu tentei usar abaixo, mas sem sorte:

* 0-1,3-23 1-3,5-17,19-31 * 1-6
    
por Pady 14.10.2015 / 17:36

3 respostas

1

Com cron somente essas exceções de tempo específicas não são possíveis de configurar. Em vez disso, você deve verificar isso no script, para que o script não seja executado quando essas exceções forem atendidas. Isso poderia, por exemplo, se parecer com isso:

#!/bin/sh

# If it's sunday ...
if [ "$(date +%u)" = "7" ]; then
  # and it's the 2nd or ...
  if ( [ "$(date +%e)" -gt "7" ] && [ "$(date +%e)" -lt "15" ] ) || \
  # or the 4th sunday of the month ...
  ( [ "$(date +%e)" -gt "21" ] || [ [ "$(date +%e)" -lt "29" ] ); then
    # look if it's between 1 and 3 AM ...
    if [ "$(date +%k)" -ge "1" ] && [ "$(date +%k)" -le "3" ]; then
      # exit the script if all of the above have met
      exit
    fi
  fi
fi

# normal script continues here

Adicione isso ao início do script.

    
por 14.10.2015 / 18:21
0

O que você pode fazer é configurar um trabalho para ser executado durante toda a duração do período que deseja excluir:

# crontab
# MIN HOUR DAY MONTH DAYOFWEEK  COMMAND
0 1 1-7,15-21 * 7 ID=naptime /path/to/naptime.sh

naptime.sh:

#!/bin/sh
# Exit unless Sunday
if [ $(date +%u) -ne 7 ] ; then
    exit
fi
sleep 2h

Em seguida, você pode configurar seu trabalho de destino para "depender" da tarefa naptime:

# crontab
* * * * * FREQ=1m AFTER=naptime/1m /path/to/job.sh

De crontab (1) :

   Jobs can be made to "depend" on, or wait until AFTER other jobs have successfully completed.  Consider the following crontab:

          * * * * * ID=job5 FREQ=1h AFTER=job4/30m second_command

   Here, whenever job5 is up to be run, if job4 is scheduled to run within the next 30 minutes (30m), job5 will first wait for it to successfully complete.
    
por 14.10.2015 / 18:03
0

Primeiro, execute seu script a cada minuto:

* * * * * /usr/local/script.sh

Em seguida, insira a lógica para que ela saia imediatamente se for:

  1. segundo domingo ou quarto domingo, ou
  2. de 1 a 3 da manhã

Este script de amostra depende de ncal e awk :

#!/bin/bash
second_sunday=$(ncal -h | awk '/Su/ {print $(NF-2)}')
fourth_sunday=$(ncal -h | awk '/Su/ {print $(NF)}')
if [[ $(date +'%d') -eq $second_sunday ]] || [[ $(date +'%d') -eq $fourth_sunday ]]
then exit 0
else
    if [[ $(date +'%H') -ge 01 ]] && [[ $(date +'%H') -lt 04 ]]
        then exit 0
    fi
fi
    
por 14.10.2015 / 18:00