3 일마다 cronjob 을 실행할 수 있습니까? 또는 한 달에 10 번 정도.
3 일마다 cronjob 을 실행할 수 있습니까? 또는 한 달에 10 번 정도.
답변:
3 일마다 실행 ...
0 0 */3 * *
어떻게에 대한?
1 일, 4 일, 7 일 등과 같은 특정 날짜에 실행되도록하려면 스크립트에 해당 월의 현재 날짜를 확인하는 조건부 만 있으면됩니다.
if (((date('j') - 1) % 3))
exit();
또는 @mario가 지적했듯이 date ( 'k')를 사용하여 날짜를 기준으로하는 대신 날짜를 가져올 수 있습니다.
0 0 */3 * *
1 일, 4 일, 7 일 등에서 실행됨을 의미합니다. ( */3
은를 1-31/3
의미합니다. 1,4,7...31
) 따라서 월말에 간격이 더 작아집니다. (전월이 31 일이면 2 일 연속 실행됩니다.) date('j') % 3
패턴이 매년 다시 시작되고 연도에는 3으로 나눌 수있는 일 수가 없다는 점에서 비슷한 문제가 있습니다.
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
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 개의 예정된 실행입니다.
나는 당신이 필요한 것을 가지고 있다고 생각하지 않습니다.
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
스크립트는 올해 말 이후에 잘못된 것입니다.
의 기본 사항을 배워야합니다 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 설정