5시간마다 실행되도록 크론 작업을 설정하는 방법

5시간마다 실행되도록 크론 작업을 설정하는 방법

아래 코드를 사용하여 5시간마다 크론 작업을 설정할 수 있나요?

0 */5 * * * script.sh

내 script.sh는 언제 실행되나요?

  1. 0000, 0500, 1000, 1500, 2000, 0100, 0600, 1100, 1600, 2100 등...

또는

  1. 0000, 0500, 1000, 1500, 2000, 0000, 0500, 1000, 1500, 2000 등...

이 전통적인 접근 방식으로는 5시간마다 크론 작업을 설정할 수 없다면 그러한 작업을 설정할 수 있는 다른 방법이 있습니까?

답변1

크론 작업은 다음과 같이 지정됩니다.

0 */5 * * * script.sh

두 번째 옵션으로 작업은 20:00부터 00:00까지 4시간 간격으로 실행됩니다.

시도해 볼 수 있는 5가지 직업 사양이 있습니다.

0 0-20/5 1-31/5 * * script.sh
0 1-21/5 2-31/5 * * script.sh
0 2-22/5 3-31/5 * * script.sh
0 3-23/5 4-31/5 * * script.sh
0 4-19/5 5-31/5 * * script.sh

세 번째 필드는 해당 월의 날짜입니다. 이렇게 하면 작업이 5일 배수로 매월 5시간마다 완벽하게 실행됩니다. 다른 달에는 해당 달의 마지막 작업 실행과 새 달의 첫 번째 실행 사이의 지연이 너무 짧은 동일한 문제가 있습니다.

괜찮을 수도 있습니다. 그렇지 않은 경우 5시간 지연이 내장된 무한 루프에서 백그라운드 작업으로 작업을 실행하는 것을 고려할 수 있습니다.

#!/bin/sh

while true; do
    script.sh &
    sleep 18000   # 5h
done

위는 백그라운드에서 실행되는 제어 스크립트입니다.

많은 반복 후에는 분명히 약간의 드리프트가 시작될 것이며 정확히 정시에 시작하는 데 어려움을 겪을 수 있습니다.

또 다른 아이디어는 다음을 사용하여 스크립트 자체를 다시 예약하는 것입니다 at.

#!/bin/sh

echo script.sh | at now + 5 hours

# rest of script goes here.

답변2

또 다른 접근 방식은 cron이 매 시간마다 스크립트를 실행하도록 하고 실제 작업은 5시간마다 수행하는 것입니다. 또는 더 간단하게는 마지막 실행 이후 최소 5시간이 경과한 경우에만 가능합니다. 파일을 타임스탬프로 사용하는 작은 스크립트를 만들 수 있습니다.

GNU 시스템에서는 다음 스크립트가 작동합니다.

#/bin/bash   
timestamp=/tmp/timestamp
interval=5*60*60             # 5 hours
if [[ ! -f /tmp/timestamp ]]; then
        touch "$timestamp"
        exit 0        # recreate timestamp and do work
fi
if [[ $(( $(date +%s) - $(date -r "$timestamp" +%s) )) -lt $interval ]]; then
        exit 1        # don't do work
fi
touch "$timestamp"    # update timestamp and do work
exit 0

( date -rGNU인데, FreeBSD에서는 사용하실 수 있을 것 같아요 stat +%m "$timestamp".)

다음과 같은 crontab 라인을 사용하여 실행하십시오.

0 * * * * /foo/every5h.sh && /foo/do_the_actual_job.sh

이로 인해 문제가 발생할 수 있습니다. 스크립트 실행이 지연되면 타임스탬프가 한 시간 후 몇 초 후에 업데이트될 수 있으며, 5시간 후에는 전체 5*60*60초가 아직 도착하지 않은 것입니다. interval=5*60*60-15이전 실행 후 04:59:45에 새 실행이 시작되도록 스크립트에서 시간 간격을 설정하여 이 문제를 해결할 수 있습니다 . 스크립트 자체는 한 시간에 한 번만 시작되므로 작업 시간이 변경되지는 않습니다.

시스템에 장애가 발생하고 5시간 이상이 경과한 경우 다음 한 시간 동안 작업이 계속됩니다. 그리고 위에서 쓴 방법처럼 타임스탬프 파일이 삭제되면 다시 생성이 되더라구요그리고이 작업은 다음 시간 안에 수행됩니다.

적어도 다음과 같은 답변이 있습니다.

답변3

5시간마다로 설정하면 5시간마다이므로 0, 5, 10, 15, 20, 1, 6 등... (*/5 구문)

0 5 10 15 20 0 5 10 등으로 설정해야 하는 경우... 명시적으로 지정해야 합니다.

0 5,10,15,20,0 * * * somejob

관련 정보