특정 날짜를 제외하는 크론을 어떻게 작성합니까?
예를 들어, 주말에 오후 6시부터 오후 9시까지 30분마다 crontab을 실행해야 하며 2014년 5월 10일만 제외하고 싶습니다.
가능합니까? 이걸 어떻게 쓸 수 있나요? 아니면 이것에 대한 대안이 있습니까? 제안해주세요.
답변1
표준 cron 구문은 매우 간단하며 제외를 지원하지 않습니다. 어떤 경우에는 이러한 논리를 구현하기 위해 여러 개의/다수의 cron 항목 목록을 만드는 것이 가능하지만 이는 지루하고 이해하거나 유지 관리하기 어려운 경향이 있습니다. 하지만 이 접근 방식은 귀하의 경우에는 적용되지 않습니다(특히 표준 cron에는 연도 개념이 없기 때문입니다).
cron 명령을 복잡하게 만드는 것은 좋은 계획은 아니지만 다음과 같이 비교적 간단한 방법으로 이를 수행할 수 있습니다.
0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0 21 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
(" 0,30 18-21
"를 사용하면 작업이 21:30에도 실행됩니다. 21:00에도 실행하려면 두 번째 줄이 필요하고, 그렇지 않으면 생략합니다.)
참고: 에서일부 크론탭Dillon의 cron에서는 그렇지 않지만 백분율 기호(명령의 표준 입력에 인라인 데이터를 채울 때 개행을 나타내는 데 사용됨)를 이스케이프해야 합니다.
cron 명령은 실제로 쉘입니다.명령 목록, ||
제어 연산자는 다음을 제공합니다.단락 평가명령의. 목록의 명령은 왼쪽에서 오른쪽으로 한 번에 하나씩 시도되지만 첫 번째 명령이 true를 반환하면 실행이 중지됩니다. 날짜 문자열 비교가 true(하루 동안만 true)를 반환하는 경우 mycommand
실행되지 않고 날짜 비교가 false를 반환하면 mycommand
실행됩니다.
그러나 cron이 프로그램을 시작하는 방식에는 많은 것들이 다를 수 있습니다. 가장 강력한 접근 방식은 래퍼 스크립트를 사용하여 조건부 논리를 구현하는 것입니다.
답변2
X-Y
시간 간격과 빈도에 사용할 수 있습니다 */Z
. 어디:
X
간격의 시작입니다.Y
간격의 끝입니다.Z
는 단지 제수일 뿐입니다(예: EachZ
).
날짜를 제외하려면 나만의 스크립트를 작성하면 됩니다. 이 스크립트 내에서 날짜를 확인한 후 다음 명령을 실행할지 결정하십시오.