흔하지 않은 일정
Cron은 모두 매우 기본적인 스케줄러로 간주되며 구문을 통해 관리자가 좀 더 일반적이지 않은 스케줄을 쉽게 작성할 수는 없습니다.
일반적으로 " command
5 분마다 실행" 되는 다음 작업을 고려하십시오 .
*/5 * * * * /path/to/your/command
대:
*/7 * * * * /path/to/your/command
항상 7 분마다 실행 되는 것은 아닙니다command
.
기억 /문자 단계를 소개하는 데 사용할 수 있지만 단계는 일련의 예의 끝을지나 포장하지 않는 것이 */7
분에서 매 7 분 일치 0-59
, 0,7,14,21,28,35,42,49 즉 56 만 1 시간 다음 사이에 있을 것입니다 배치 사이에만 사분 후, 00:56
새로운 시리즈가 시작 01:00
, 01:07
등 (및 배치가 실행되지 않습니다 01:03
, 01:10
, 01:17
등).
대신 무엇을해야합니까?
여러 배치 생성
단일 cron 작업 대신 원하는 스케줄로 결합 된 여러 배치를 작성하십시오.
예를 들어 40 분마다 배치를 실행하려면 (00:00, 00:40, 01:20, 02:00 등) 두 개의 배치를 작성하십시오. 하나는 짝수 시간에 두 번 실행되고 다른 하나는 홀수 시간에만 실행됩니다.
# The following lines create a batch that runs every 40 minutes i.e.
# runs on 0:00, 0:40, 02:00, 02:40 04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command
# runs on 01:20, 03:20, etc to 23:20
20 1/2 * * * /path/to/your/command
# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.
배치를 덜 자주 실행하십시오
여러 배치로 분류하기 어려운 7 분마다 배치를 실행하는 대신 10 분마다 실행하면됩니다.
일괄 처리를 더 자주 시작하십시오 (하지만 여러 일괄 처리가 동시에 실행되지 않도록 방지)
배치 런타임이 증가 / 변동하고 배치가 동일한 배치의 후속 실행이 겹치거나 동시에 실행되는 것을 방지하기 위해 약간의 추가 안전 여유가 있기 때문에 많은 홀수 스케줄이 발전합니다.
대신 다르게 생각하고 이전 실행이 아직 완료되지 않았을 때 정상적으로 실패하지만 그렇지 않으면 실행되지 않는 cronjob을 작성하십시오. 이 Q & A를보십시오 :
* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job
/ usr / local / bin / frequent_cron_job의 이전 실행이 완료되면 거의 즉시 새 실행이 시작됩니다.
배치를 더 자주 시작하십시오 (하지만 조건이 맞지 않으면 정상적으로 종료)
cron 구문이 제한 되어 있으므로 일괄 작업 자체 (또는 기존 일괄 작업 주위의 래퍼 스크립트)에 더 복잡한 조건과 논리 를 배치 할 수 있습니다 . 이를 통해 자주 사용하는 스크립팅 언어의 고급 기능을 활용하여 코드에 주석을 달고 crontab 항목 자체에서 읽기 어려운 구문을 방지 할 수 있습니다.
bash에서 seven-minute-job
그러면 다음과 같이 보일 것입니다.
#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated
if [ ! -f /tmp/lastrun ] ; then
touch /tmp/lastrun
fi
if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
# The minimum interval of 7 minutes between successive batches hasn't passed yet.
exit 0
fi
#### Start running your actual batch job below
/path/to/your/command
#### actual batch job is done, now update the time stamp
date > /tmp/lastrun
#EOF
그런 다음 매분 안전하게 실행할 수 있습니다 (시도).
* * * * * /path/to/your/seven-minute-job
날짜가 1 사이의 어느 쪽도 없을 때 다른,하지만 비슷한 문제는 간단히 매주 월요일과 종료를 실행하는 배치 일정 등 매월 첫 번째 월요일 (또는 두 번째 수요일)에 실행되도록 배치를 예약하는 것 일 또는 7 일 및 요일은 월요일이 아닙니다.
#!/bin/bash
# first-monday-of-the-month-housekeeping-job
# exit if today is not a Monday (and prevent locale issues by using the day number)
if [ $(date +%u) != 1 ] ; then
exit 0
fi
# exit if today is not the first Monday
if [ $(date +%d) -gt 7 ] ; then
exit 0
fi
#### Start running your actual batch job below
/path/to/your/command
#EOF
그러면 매주 월요일마다 안전하게 (시도) 실행할 수 있습니다.
0 0 * * 1 /path/to/your/first-monday-of-the-month-housekeeping-job
크론을 사용하지 마십시오
요구 사항이 복잡한 경우 복잡한 일정 (여러 서버에 분산)을 실행하도록 설계되고 트리거, 작업 종속성, 오류 처리, 재시도 및 재시도 모니터링 등을 지원하는 고급 제품을 사용하는 것이 좋습니다. 업계 전문 용어는 "기업"입니다. " 작업 스케줄링 및 / 또는"워크로드 자동화 ".