3 일마다 크론 작업


93

3 일마다 cronjob 을 실행할 수 있습니까? 또는 한 달에 10 번 정도.


4
예, 가능하며 이것은 SuperUser에 속합니다.

월 경계에 관계없이 3 일마다 실행하는 것은 anacron으로 수행 할 수 있습니다.
ryanpattison

답변:


125

3 일마다 실행 ...

0 0 */3 * *

어떻게에 대한?

1 일, 4 일, 7 일 등과 같은 특정 날짜에 실행되도록하려면 스크립트에 해당 월의 현재 날짜를 확인하는 조건부 만 있으면됩니다.

if (((date('j') - 1) % 3))
   exit();

또는 @mario가 지적했듯이 date ( 'k')를 사용하여 날짜를 기준으로하는 대신 날짜를 가져올 수 있습니다.


9
@whatshakin : "3 일마다"얼마나 정확하길 원하는지에 따라 달라집니다. 이것은 3으로 나눌 수있는 모든 날에 작동합니다. 월 경계에서는 정확하지 않습니다.
David

3
@whatshakin : cronjob 구문은 Wikipedia에도 설명되어 있습니다. en.wikipedia.org/wiki/Cronjob
Felix Kling

4
이것은 Google에서 매우 높은 결과이며 수락 된 답변이 정확하면 더 좋을 것입니다. 타 레코의 설명이 맞다고 생각합니다.
lynks

14
어떤 제안도 실제로 3 일마다 작업을 실행하지 않기 때문에 대답이 올바르지 않습니다. 0 0 */3 * *1 일, 4 일, 7 일 등에서 실행됨을 의미합니다. ( */3은를 1-31/3의미합니다. 1,4,7...31) 따라서 월말에 간격이 더 작아집니다. (전월이 31 일이면 2 일 연속 실행됩니다.) date('j') % 3패턴이 매년 다시 시작되고 연도에는 3으로 나눌 수있는 일 수가 없다는 점에서 비슷한 문제가 있습니다.
cjm

8
저도 이것이 답으로 받아 들여진 것을 안타깝게 생각합니다. 나는 달의 경계에 관계없이 매 N 일을 정말로 찾고 있었다 (식물과 같은 것은 그들이 물을 얻는 날은 상관하지 않는다). 적어도 나는 모든 주석을 읽은 후에 크론 타이머가 그 욕망을 완전히 모델링하지 않는다고 결정했다고 생각합니다.
Travis Griggs 2015

69
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.

설명 감사
pythonian29033

2
이것은 일반적으로 3 일을 발사하지만, 한 달의 시작 부분에 다음 날 해고 할 수
Dziamid

24

저는 크론 전문가는 아니지만 다음은 어떻습니까?

0 */72 * * *

72 시간마다 중단없이 실행됩니다.

https://crontab.guru/#0_ / 72_ _ _


3
이것은 허용 된 솔루션보다 더 정확합니다. 개월 변경시 수락 된 답변이 실패합니다.then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Akira Yamamoto

이것이 언제 발생하는지 어떻게 계산합니까?
Bruce Edge

2
crontab.guru 에 따르면 이것은 매일 실행됩니다. 누구가 맞습니까?
velop

1
시간 열의 값은 crontab.guruman crontab 에 따라 0에서 23 사이 여야합니다 .
harperville

1
* / 72는 사실상 0과 동일합니다. 이것은 매일 자정에 실행됩니다.
battey

19

cron은 "stateless"이기 때문에 "frequencies"를 정확하게 표현할 수 없으며 현재 시간과 지속적으로 일치하는 "패턴"만 표현할 수 있습니다.

질문을 바꾸면 "2 박 이내에 실행 된 밤을 건너 뛰는 것을 제외하고 매일 오전 00:01에 cronjob을 실행할 수 있습니까?" 크론이 현재 시간을 작업 요청 시간 패턴과 비교할 때 크론이 과거에 작업을 실행했는지 알 수있는 방법은 없습니다.

일반적으로 반복되는 이벤트를 종료하고 완전히 새로운 이벤트를 다시 시작해야합니다. 이것은 복잡한 캘린더 앱도 반복 패턴을 표현하는 방식에 대한 제한된 표현을 보여줍니다. 물론 캘린더에는 많은 상태가 있습니다. 각 개별 이벤트는 [대부분의 캘린더 앱에서] 독립적으로 삭제하거나 일정을 조정할 수 있습니다.

또한 성공한 경우 3 일마다 작업을 수행하고 싶지만 마지막 작업이 실패한 경우 즉시 다시 시도하거나 다음날 밤 (3 일 더 기다리지 않음) 또는 더 빨리 1 시간 후 (다시 시도 중지) 아침 도착시). 분명히, 크론은 당신의 작업이 성공했는지 알 수 없었고 패턴은 더 빈번한 "재시도"일정을 표현할 수 없습니다.

어쨌든-원하는 것을 스스로 할 수 있습니다. 스크립트를 작성하고 cron에게 밤마다 오전 00:01에 실행하라고 지시하십시오. 이 스크립트는 "마지막 실행"을 기록하는 항목 *의 타임 스탬프를 확인할 수 있으며, 3 일 이상 전 **이면 작업을 수행하고 "마지막 실행"타임 스탬프를 재설정합니다.

(* 타임 스탬프 표시기는 조작하고 검사 할 수 있지만 크론은 할 수없는 약간의 지속 된 상태입니다.)

** 사람이 읽을 수있는 시계 시간을 사용하는 경우 시간 산술에주의하십시오. 1 년에 두 번, 어떤 날에는 하루에 23 시간 또는 25 시간이 있으며, 02 : 00-02 : 59는 ​​하루에 두 번 발생하거나 모두. 이를 방지하려면 UTC를 사용하십시오.


7
0 0 1-30/3 * *

이것은 1 일부터 3 일마다 실행됩니다. 다음은 20 개의 예정된 실행입니다.

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00

5
2015-07-31 00:00:00, 2015-08-01 00:00:00 ... 실행 사이에 단 하루 만 OOPS
Dziamid

4

나는 당신이 필요한 것을 가지고 있다고 생각하지 않습니다.

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

불행하게도, * / 3의 간격을 설정하는 것입니다 매 n 달의 날하지 매 n 일 . 참조 : 여기에 설명 . 월말에 반복되는 문제가 보장됩니다.

1st  at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...

이 기사 에 따르면 "N 일마다"TRUE를 얻으려면 실행중인 명령에 모듈로 수학을 추가해야합니다. 예를 들면 :

0 0 * * *  bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh

이 예에서 작업은 매일 오전 12:00에 확인되지만, 01-01-1970 모듈로 3 이후의 일 수가 0 일 때만 실행됩니다.

특정 날짜로부터 3 일마다 표시하려면 다음 형식을 사용하십시오.

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh

3

어때 :

00 00  *  *   * every 3 days && echo test

every스크립트는 어디에 있습니까?

#!/bin/sh

case $2 in
    days)
        expr `date +%j` % $1 = 0 > /dev/null
        ;;

    weeks)
        expr `date +%V` % $1 = 0 > /dev/null
        ;;

    months)
        expr `date +%m` % $1 = 0 > /dev/null
        ;;
esac

그래서 매일 실행됩니다.

사용 */3은 매월 3, 6, ... 27, 30 일에 실행되지만 한 달에 31 일이 지나면 잘못된 것입니다. every스크립트는 올해 말 이후에 잘못된 것입니다.


3

의 기본 사항을 배워야합니다 crontab.

명령으로 cron을 편집 한 crontab -e다음 ⌃ (CTRL)+를 X누른 다음 Y마지막 ENTER (return)으로 Mac에서 파일을 저장하십시오. 새로운 크론이 설치되었는지 확인할 수 있습니다.crontab -l

crontab 파일에는 분, 시간, 일, 월 및 요일을 지정하기위한 5 개의 필드가 있으며 그 다음에 해당 간격으로 실행할 명령이 있습니다.

*     *     *   *    *   command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- min (0-59)

* 위의 값 필드에서 해당 열의 중괄호에있는 모든 유효한 값을 의미합니다.

여기에 이에 대한 자세한 게시물을 썼습니다. 유닉스에서 Cron 설정


1

예를 들어 월요일과 목요일에 실행되도록 구성하면 3 일과 4 일의 휴식 시간이 주어집니다.

그렇지 않으면 매일 실행되도록 구성하되 다음을 사용하여 PHP cron 스크립트를 일찍 종료하십시오.

if (! (date("z") % 3)) {
     exit;
}

0

1 일, 4 일, 7 일 등과 같은 특정 날짜에 실행되도록하려면 스크립트에 해당 월의 현재 날짜를 확인하는 조건부 만 있으면됩니다.

나는 이것을 위해 필요한 모든 것이 * / 3 대신에 3 일마다, 1/3을 사용하는 것은 매월 1 일부터 3 일마다를 의미한다고 생각했습니다. 따라서 7/3은 매월 7 일부터 3 일마다를 의미합니다.


0

0 0 * * * [ $(($((날짜 + %-j- 1)) % 3)) == 0 ] && script

에서 연중 일을 가져 date오고 1로 오프셋하여 0에서 시작하고 모듈로 3인지 확인합니다.


이 때문에, 내년에 비 윤년에서 롤오버이 딸꾹질하지 않습니다 ( 365-1 ) % 3 == 1하지만 ( 1 - 1 ) % 3 == 0? 더 나은 계산은 Unix Epoch 이후 일 수를 기반으로 할 것이라고 생각합니다.
kmoser
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.