격주 cronjob을 예약하는 방법?


11

crontab (5)는 다음 필드를 정의합니다.

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

그리고 설명 :

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

내 이해가있는 한, 격주로 잡을 수 없습니다. 해결 방법이 있다고 확신합니다. 무엇입니까? 아니면 내가 뭔가를 그리워 했습니까?


2
내가 찾을 수있는 가장 좋은 대답은 여기에 있습니다 : unix.stackexchange.com/questions/1224/…
Somantra

... 그리고 U & L에 대한 답변은 내가하는 방식 일 것입니다, @Somantra :-)
voretaq7

@ voretaq7, 나는 그것이 정식 답변이라고 말했을 것입니다. 그러나 나는 pedantic처럼 만나고 싶지 않았습니다. ;-)
Somantra

답변:


8

매주 수요일마다 cron이 실행하도록 한 다음 짝수 또는 홀수 주인지 결정하십시오. 예를 들면 다음과 같습니다.

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

그러나 이것은 훌륭한 해결책이지만 실제로 질문 자체에 대답하지는 않습니다. 일정 논리로 물건을 망치지 않는 것이 좋습니다. 어쩌면 이것을 @Somantra가 준 링크와 통합 할 수 있습니다.
Roman

그래, 인정해야한다 : 이것은 지금까지 가장 좋은 해결책이다. @Somantra가 제공 한 링크는 동일한 결과를 불필요하게 복잡한 IMHO (UNIX 시간 계산)로 달성하지만 동일한 스타일로 스크립트 대신 크론 작업에 직접 접근 방식을 추가하면 매우 우아합니다.
Roman

이것은 53 주가 있기 때문에 2020 년에 중단됩니다. 예 : cron이 12 월 31 일에 격주로 실행되도록 계획된 경우 2020 년 12 월 31 일 (53 주) 및 2020 년 1 월 4 일 (1 주)에 실행됩니다.
mad_fox

5

많은 크론 (사용중인 것을 지정하지 않은)이 범위를 지원합니다. 그래서 같은

0 0 1-7,15-21 * 3

매월 첫째, 셋째 주 수요일을 맞았습니다.


이것은 "스크립트에서 수행"방법보다 약간 더 우아하지만, crontab에 주석을 추가해야합니다 (일반적인 규칙 : 둘 이상이 -있거나 /관련이 있다면 일정을 설명하는 것이
좋습니다

나는 이것이 틀렸다고 생각한다. 매월 1 ~ 7 일, 15 ~ 21 일 , 매주 수요일에도 작업이 실행됩니다 . 의이 man 5 crontab: " 명령의 실행의 날은 두 개의 필드로 지정 될 수 있습니다 - 달의 일, 요일 두 필드가 제한되는 경우 때 (즉,하지 *있다), 명령이 실행됩니다. 필드가 일치 예를 들어, "30 4 1,15 * 5"는 매월 1 일과 15 일 오전 4시 30 분과 매주 금요일마다 명령을 실행합니다 (내 강조).
MadHatter

1
실제로, 이는 사용중인 cron 데몬에 따라 다릅니다. 귀하의 작품은 vixie cron (RedHat 배포판에 포함)에서 온 것 같습니다. dillo의 cron에있는 "man crontab"에서 (Slackware) : 달과 요일을 모두 지정하면 *이 달의 N 번째 날로 해석됩니다 *. 여전히 스크립팅 된 솔루션 (계산 주 번호)은 유일한 휴대용 솔루션처럼 보입니다.
AlvaroGMJ

2

격주로 실행해야하는 무언가를 위해이 1 강선을 사용하십시오 :

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

이 특정 스크립트는 금요일에 실행되도록 예약되어 있습니다. 실행할주는 "-eq 0"또는 "-eq 1"을 사용하여 조정할 수 있습니다.


1

Anacron 은 cron의 한계에 대한 좋은 해결 방법입니다.

  • Anacron에는 반복 기간 매개 변수가 있으며이를 14로 설정할 수 있습니다.

기간 지연 작업 식별자 명령

14 15 test.daily /path/to/script.sh


불행히도 anacron을 사용할 수 없습니다. 언급하는 것을 잊었다.
Roman

1

2 주에 한 번만 필요한 것이 아니라면 매월 1 일과 15 일에 크론 작업을 실행할 수 있습니다.

15 8 1,15 * * /your/script.sh

요일에 관계없이 매월 1 일과 15 일 오전 8시 15 분에 실행됩니다.


-2

그 주에서 3/2의 설명 설정에서 다른 모든 수요일에 작업을 실행해야합니다. 내재적이지만 가능하다고 생각합니다.


아니요, 이것은이 for(int i=3; i <=3 ; i+=2) {} 과정이 한 번만 진행되므로 "단계"가 1 또는 2인지는 중요하지 않습니다.
stew

@stew가 말한 것. 또한 "주 필드"는 없습니다.
Roman

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