cron에게 격일로 명령을 실행하도록 지시하는 방법 (홀수 / 짝수)


45

"월별"필드를 사용하여 격일로 명령을 실행하도록 cron을 구성 할 때 다음과 같이하십시오.

1 22 */2 * * COMMAND

매월 1,3,5,7,9 등이 홀수 일 때마다 실행됩니다.

cron을 2,6,8,10과 같은 달에 실행하도록 구성하려면 어떻게해야합니까 (문자 그대로 지정하지 않으면 매월 달에 다른 일수가 있으므로 문제가됩니다)?

답변:


60

시도한 구문은 실제로 모호합니다. 한 달에 몇 일이 있는지에 따라 몇 달은 홀수 일에, 일부는 짝수 일에 실행됩니다. 계산 방법이 총 확률 수를 취하여 나누기 때문입니다. 날짜 범위를 수동으로 지정하고 홀수 또는 짝수 일을 사용하여이 전략적 동작을 무시할 수 있습니다. 짝수 일 스크립트는 더 긴 달의 31 일에는 실행되지 않으므로 짝수 일의 기준으로 30 일을 사용하여 아무것도 풀지 않으며 31 일이있는 것처럼 분할하도록 특별히 지정하면 홀수 일 수 있습니다. 하루 실행.

구문은 다음과 같습니다.

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

같은 날 수가없는 달에 대한 걱정은 여기서 중요하지 않습니다. 달이 이보다 더 많은 날이없고 2 월이 열악한 경우 날짜 범위가 마지막 날 또는 이틀과 일치하지는 않지만 해가되지는 않습니다. 그것은 나열했다.

이 방법의 유일한 'gotcha'는 홀수주기에 있고 31 일이있는 달이 지나면 달의 첫 번째 명령도 실행된다는 것입니다. 마찬가지로 짝수주기를 강요하면 윤년마다 3 일주기가 1 월이고 2 월 말이됩니다. "매일 다른 날"의 규칙적인 패턴이 매월 짝수 또는 홀수 일에 빠지는 것은 아니며,이를 강제하는 방법은 여분의 달리기를하거나 달리는 것을 놓치게된다는 사실을 실제로 해결할 수는 없습니다. 일 수가 일치하지 않는 달.


1
감사합니다.하지만 28 일밖에없는 2 월과 같은 달에는 어떻게 되나요? 별은 실제로 그것을 처리하지만 실제로는 모호합니다.
프레디

3
@ 프레디 : 편집 된 답변을 참조하십시오 ...하지만 범위를 벗어난 값은 무시되기 때문에 문제가 아닙니다 .2 월 30 일 또는 31 일에는 아무 일도 일어나지 않습니다. 이제까지. 같은 목록으로 수동으로 지정할 수 0,2,4...,30,32,34있으며 범위를 벗어난 값은 절대 일치하지 않습니다.
Caleb

1
감사! 유익한 답변을 주셔서 감사합니다.
프레디

3
Ubuntu 서버 8.04에서 월 0을 사용하는 구문이 유효하지 않은 것 같습니다 (나쁜 요일). 그러나 다음 구문이 허용됩니다.0 0 2-30/2 * * command

1
Fedora와 RHEL 5,6,7도 한 달에 0을 좋아하지 않습니다. user31053이 지적했듯이 0 0 2-30/2 * * command예상대로 작동합니다.
NoelProf 2016 년

2

가능성은 다음과 같이 하루 중 하나를 사용하고 있다고 생각합니다.

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

Unix 및 Linux 시스템에서 테스트되었습니다.


이 답변은 몇 달 동안 홀수 일의 문제를 건너 뛰기 때문에 선호합니다. 어쨌든 나는 대신 달러 표기법을 제안합니다.test $(($(date +%j) % 2)) == 0 && command
caligari

나는 % j가 율리우스 날짜가 아니라는 것을 검토 했으므로 새해 전환을 피하는 가장 좋은 코드는 초 단위로 계산되어야합니다.test $(($(date +%s) / 86400 % 2)) == 0 && command
caligari

의견 주셔서 감사합니다! 우리의 제안은 매력처럼 우리를 위해 일했습니다. 우리는이 체계를 사용하여 매일 같은 크론 탭을 공유하는 서로 다른 서버 노드에서 크론을 실행했지만 스크립트는 그 중 하나에서만 스크립트를 실행할 수 있습니다. 그러나보다 구체적으로 작성해야하는 경우 귀하의 제안을 고려할 것입니다. 감사!!!
Jordi

1

"other"인 경우 매일 확인하십시오 :-) ( bc프로그램 필요)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(코드가 올바르게 나타나는지 확실하지 않습니다. date +%s부분은 백 아포스트로피 사이에 있습니다.)


이것은 격일로 실행되지만 질문에 대답하지 않습니다! 때로는 달에 따라 홀수 일에 때로는 짝수 일에 계속 실행됩니다. 이것은 질문의 코드와 동일한 결과를 낳습니다. 신기부터 초에 자신의 수학을 수행하여 결과에 도달했습니다. 이것은 에포크 이후로 며칠 동안 실행되지만 달력의 며칠에는 실행되지 않습니다.
Caleb

1

일반적으로 매일 실행하고 스크립트를 사용하여 오늘 실행해야하는지 여부를 결정합니다.

마지막 실행 후 알려주는 간단한 상태 파일을 작성하면 매우 쉽게 작동합니다.

다른 소스를 통해 실행해야하는 경우 인수에 따라 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.