[cron] 3 일마다 크론 작업

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



답변

3 일마다 실행 …

0 0 */3 * *

어떻게에 대한?

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

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

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


답변

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

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


답변

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

0 */72 * * *

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

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


답변

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

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

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

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

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

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

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


답변

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


답변

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

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


답변

어때 :

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스크립트는 올해 말 이후에 잘못된 것입니다.