아래 코드를 사용하여 5시간마다 크론 작업을 설정할 수 있나요?
0 */5 * * * script.sh
내 script.sh는 언제 실행되나요?
- 0000, 0500, 1000, 1500, 2000, 0100, 0600, 1100, 1600, 2100 등...
또는
- 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 -r
GNU인데, 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