cronjob에서 특정 날짜 및 시간 제외

cronjob에서 특정 날짜 및 시간 제외

저는 작업이 매월 둘째, 넷째 일요일 오전 1시부터 오전 3시까지를 제외하고 매일, 매월, 매분, 매시간 실행되어야 한다는 요구 사항으로 cron 작업을 예약하려고 합니다.

우리가 할 수 있는 방법이 있나요? 나는 성공하지 못한 채 아래 방법을 사용해 보았습니다.

* 0-1,3-23 1-3,5-17,19-31 * 1-6

답변1

cron이러한 시간별 예외를 단독 으로 구성하는 것은 불가능합니다. 대신, 이러한 예외가 발생할 때 스크립트가 실행되지 않도록 스크립트에 검사를 넣어야 합니다. 예를 들어 다음과 같을 수 있습니다.

#!/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

스크립트 시작 부분에 추가하세요.

답변2

dcron을 사용하는 경우 제외하려는 전체 기간 동안 실행되는 작업을 설정하면 됩니다.

# 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

그런 다음 낮잠 시간 작업에 "의존"하도록 대상 작업을 설정할 수 있습니다.

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

~에서예약된 작업(1):

작업은 다른 작업이 성공적으로 완료될 때까지 "의존"하거나 기다릴 수 있습니다. 다음 crontab을 고려하십시오.

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

여기서 job5가 실행될 때마다 job4가 다음 30분(30m) 내에 실행되도록 예약된 경우 job5는 먼저 성공적인 완료를 기다립니다.

(job4가 성공적으로 완료되지 않으면 어떻게 됩니까? job4가 종료 코드 EAGAIN으로 반환되면 job5는 한 시간 내에 다시 시도하지 않더라도 job4가 다시 시도될 때까지 계속 기다립니다. job4가 0이 아닌 다른 종료 코드로 반환되는 경우 , job5는 대기열에서 제거되고 실행되지 않습니다.)

답변3

먼저 1분마다 스크립트를 실행합니다.

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

그런 다음 다음과 같은 경우 즉시 종료되도록 논리를 삽입하십시오.

  1. 둘째, 넷째 일요일 또는
  2. 오전 1시부터 오전 3시까지

이 예제 스크립트는 ncal및 다음을 사용합니다 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

관련 정보