매월 첫째 월요일에 크론 작업을 실행 하시겠습니까?


32

매월 첫 번째 월요일에 8.30에 cron에서 작업을 수행하고 싶습니다. 크론 위키 백과 페이지는 말합니다

일반적으로 시간 / 날짜 스펙 필드가 모두 현재 시간 및 날짜와 일치 할 때 작업이 실행되지만 "달"과 "요일"이 모두 제한되는 경우 ( "*"아님) 한 가지 예외가 있습니다. "월요일"필드 (3) 또는 "요일"필드 (5)는 현재 날짜와 일치해야합니다.

(내 강조)

그것은 그 달의 첫 번째 월요일을 할 수 없다는 것을 의미합니까, 나는 그 달의 첫 번째 (또는 무엇이든) 할 수 있습니까? 나는 그 길을 생각할 수 없다.


slhck-좋은 해결책 인 것 같습니다-전체 코드로 답변으로 확장 하시겠습니까? 그럼 나는 그것을 올바른 것으로 표시합니다 :)
Max Williams

답변:


39

실제 crontab 명령에 조건을 넣을 수 있습니다.

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

이제이 조건이 한 달의 첫 7 일 중 하나에 해당하면 첫 번째 월요일이됩니다. crontab에서는 퍼센트 구문을 이스케이프해야합니다.

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

바꾸기 echo실행할 실제 명령을 사용하여 명령을. 나는 비슷한 접근법을 찾았다 .


실제로, slhck, 나는 너무 빨리 말했다-이것은 crontab에서 작동하지 않습니다 : 어떤 이유로 날짜 테스트에 문제가있는 것 같습니다. 이것은 명령 줄에서 [ "$(date '+%a')" = "Mon" ] && echo "It's Monday"와 같이 작동 [ $(date '+%a') = "Mon" ] && echo "It's Monday" 하지만 crontab에서는이 테스트에서 실패한 것으로 보입니다. cron에서 유용한 피드백을 얻을 수 없습니다 : [ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1오류 출력을 로그로 캡처 하려고 시도 중이지만 작동하지 않습니다 : /
Max Williams

흠. date출력이 올바른지 확인할 수 있습니까 ? 예를 들어, cron이것을 파일로 출력 하는 명령을 실행하십시오 : date '+%a' > ~/datetest 2>&1– 그 결과 비교할 문자열이 올바른지 확인하십시오.
slhck

1
나는 +%acrontab에있을 때 탈출 해야하는 비율 , 즉 다음과 같은 줄 이 문제가 있음을 발견했습니다 [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday". 당신이 당신의 대답을 업데이트 할 수 있다면 그것은 미래의 독자들에게 도움이 될 것입니다 그와 함께 :) 다시 한번 감사 - 최대
최대 윌리엄스

아, 이제 이유를 봅니다. 사용해 주셔서 감사합니다. 사용해 주셔서 감사합니다.
slhck

14

스페인어로 된 로캘이있는 컴퓨터가 있으므로 monlun으로 변경 되므로이 방법이 효과가 없습니다.

다른 언어도 실패 할 것이므로 언어 ​​장벽을 극복하는 허용되는 답변을 약간 변형했습니다.

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

+1 ¡ Muy bien, señor!
JakeGould

1
Gracias ¡ Pura vida! ; D
cumanacr 2018 년

이것이 정답입니다. 평일에 다른 이름을 사용하는 네덜란드어 로케일이 있습니다. 숫자를 사용하는 것도 요일을 결정하기 위해 문자열을 비교하는 것보다 깨끗합니다.
0ne_Up

7

요일 번호를 처리 할 필요가 없을 때 더 쉽다는 것을 알았습니다.

매월 첫 번째 월요일 실행 :

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

즉, 1 주일 전의 달이 현재 달과 같지 않으면 해당 월의 1 일 1 (= 월요일)에 있습니다.

마찬가지로 세 번째 금요일

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

즉, 3 주 전의 달이 현재 달과 다른 경우 해당 월의 3 일째 6 일 (= 금요일)에 있습니다.


요일 6은 금요일이 아닌 토요일입니다.
로버트

4

다음과 같이 매월 네 번째 월요일 오후 4시에 작업을 실행하도록 예약했습니다.

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

1

내가 아는 한 crontab 만 사용하는 것은 불가능하지만 래퍼 함수를 ​​사용하여 "매월 7 일"contab 항목에서 올바른 요일을 선택할 수 있습니다. 항목에서 이것을 참조하십시오 .

랩퍼 스크립트는

#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
   exec somecommand
fi
exit 1

crontab 항목을 사용하여 실행해야합니다 (wrapper.sh라고하고 전 세계적으로 사용 가능하다고 가정).

0 0 * * 1 wrapper.sh

감사합니다 elemaki. 나는 실행되는 작업 내에서 여분의 코드를 사용하여 스크립트 내에서 월의 첫 번째 월요일인지 테스트 한 다음 매주 월요일마다 crontab에서 호출하는 비슷한 솔루션에 대해 생각했습니다. 루비 스크립트이므로 요일을 쉽게 테스트 할 수 있습니다. 그러나 나는 crontab 유일한 방법이 있기를 바랐다.
맥스 윌리엄스

1

Solaris 10에서는 다음과 같이 조건을 포맷해야했습니다.

[ `date +\%a` = "Sat" ] && echo "It's Saturday"

1

매월 7 일 동안 cronjob을 실행하여 월요일에만 실행할 수 있습니다.

30 8 * * 1 [`date +\%d` -le 07] && <job>

위는 당신을 위해 작동합니다.


1 주일 동안 성공률을 +1 증가하고 월요일을 확인하십시오. :-)
xmedeko

1

나는 사용하는 것이 좋습니다

"$(/bin/date '+%\w')" = "1"

대신에

"$(date '+\%a')" = "Mon"

로케일 문제를 피하기 위해.


0

나는 이런 종류의 문제에 대한 일반적인 해결책을 만들었습니다. 매월 마지막 주중에 작동합니다.

다음과 같이 사용할 수 있습니다.

30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"

스크립트 요일 실행 요일과 요일 범위를 모두 확인합니다. 둘 다 일치하면 0을, 그렇지 않으면 1을 반환합니다.

여기에서 코드를 확인하십시오. https://github.com/xr09/cron-last-sunday


0

이것이 문제를보다 우아하게 해결한다고 생각합니다.

30 8 1-7 * 1 /run/your/job.sh

1
도! : "두 필드가 모두 제한되어 있으면 (즉, *가 아닌 경우) 두 필드 중 하나가 현재 시간과 일치 할 때 명령이 실행됩니다."
symcbean

또한 2 월 (28 일에 끝나는 날)에는 4 년마다 운영되지 않습니다.
igraczech

"둘 중 하나"는 "둘 다"가 아닌 둘 중 하나를 의미합니다. 이것은 매월 1 일 7 일 동안 매일 실행됩니다.
14

이 행은 매월 1 일에서 7 일, 매주 월요일에 명령을 실행합니다
Tomasz Jakub Rup

0

PHP와 js를 사용하여 cron 문을 해석하기 때문에 bash를 사용할 수 없습니다. 마지막으로 나는 것을 발견 입니다 실제로 단지 크론와 수 :

0 30 8 * 1/1 MON#1

이것이 다른 누군가를 돕기를 바랍니다. 어쨌든, 나는 당신 모두 아름다운 하루를 기원합니다. :-)


이것은 cron이 아니며, 아마도 쿼츠 일 것입니다
Sivann

-1
0 9 1-7 * 1 * 

이것은 매월 월요일마다 작동합니다.


답변이 수락되었습니다. 답이 더 좋거나 다르거 나 최신 버전에 유용합니다.
mic84
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.