Cron은 데비안에서 "월의 마지막 날"에 특수 문자 "L"을 허용합니다.

Cron은 데비안에서 "월의 마지막 날"에 특수 문자 "L"을 허용합니다.

L이것이 데비안의 cron 구현에 허용되는 특수 문자 중 하나인지 궁금합니다 . 매달 마지막 날에 실행할 cron을 설정하려고 합니다.

~에서Wikipedia의 cron 항목:

"L"은 "마지막"을 의미합니다. 요일 필드에 사용되면 해당 월의 "마지막 금요일"("5L")과 같은 구조를 지정할 수 있습니다. 날짜 필드에는 해당 월의 마지막 날을 지정합니다.

참고: L은 비표준 문자이며 일부 cron 구현(Quartz Java 스케줄러)에만 존재합니다.

그렇지 않다면 매월 마지막 날에 실행되도록 크론을 어떻게 설정하시겠습니까? 3개의 다른 항목을 추천하시겠습니까?stackoverflow에 대한 이 솔루션?

답변1

Debian의 Cron 항목은 man 5 crontabcrontab 매뉴얼 페이지( )에 설명되어 있습니다. 데비안은 Vixie의 cron을 사용하며 맨페이지에는 다음과 같이 나와 있습니다:

   The crontab syntax does not make it possible  to  define  all  possible
   periods  one could image off. For example, it is not straightforward to
   define the last weekday of a month. If a task needs to be run in a spe-
   cific  period of time that cannot be defined in the crontab syntaxs the
   best approach would be to have the program itself check  the  date  and
   time  information and continue execution only if the period matches the
   desired one.

   If the program itself cannot do the checks then a wrapper script  would
   be required. Useful tools that could be used for date analysis are ncal
   or calendar For example, to run a program the last  Saturday  of  every
   month you could use the following wrapper code:

   0 4 * * Sat   [ "$(date +%e)" = "`ncal | grep $(date +%a | sed  -e 's/.$//') 
     | sed -e 's/^.*\s\([0-9]\+\)\s*$/\1/'`" ] && echo "Last Saturday" &&
     program_to_run

따라서 다음과 같이 작업하십시오.

   0 0 * * * perl -MTime::Local -e 
       'exit 1 if (((localtime(time()+60*60*24))[3]) < 2);' || program_to_run

답변2

LLinux의 cron 구현에서 이런 일이 발생하는 것을 본 적이 없습니다 .

매월 말일에 작업을 실행하려면 실제 일수의 상위 집합에서 실행하고 다음 날 날짜를 확인하세요. GNU를 사용하면 다음 날 날짜를 표시 date하여 date -d tomorrow해당 날짜가 여전히 같은 달인지 확인할 수 있습니다. 일광 절약 시간이 시작되거나 끝나는 날 특정 위치에서 문제가 발생하지 않도록 하려면 이른 아침(예에서는 12:00/정오)이 아닌 시간을 지정하세요. 이는 %crontab에서 특별하며 백슬래시로 보호해야 한다는 점을 기억하세요.

42 1 28-31 * * if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'tomorrow 12:00' +\%m)" ]; then last_day_of_month_job; fi

해당 달의 특정 요일이 마지막으로 나타나는 경우에도 동일한 기술을 적용할 수 있습니다. 작업은 매주 실행되며 다음 발생이 다른 달에 발생하는 경우에만 트리거됩니다.

42 1 * * 3 if [ "$(date -d 'today 12:00' +\%m)" != "$(date -d 'now + 7 days 12:00' +\%m)" ]; then last_wednesday_of_month_job; fi

답변3

시계를 바꿔야 하기 때문에 이를 실험적으로 확인하는 것은 다소 어색한 것 같습니다.

데비안은빅시 크론구현에 대해서는 Wikipedia 기사에 언급되어 있습니다. crontab 표현식의 형식은 에 설명되어 있는데 , 이는 동일하지 않기 man 5 crontab때문에 약간 까다롭습니다 (기본 섹션 1은 명령 이고 섹션 5는 "crontab" 파일의 형식입니다).man crontabcrontab

"L"은 언급되지 않습니다.

WRT SO 대안인 확인된 답변은 따르기가 가장 쉽고 외부 스크립트 등이 필요하지 않습니다. OTOH, 윤년 문제가 있습니다 ...

답변4

내 스크립트에는 해당 기능이 있으며 기본 cron은 아니지만 트릭을 수행합니다.

http://xr09.github.io/cron-last-sunday/

예:

# every last sunday
30 6 * * 7 root run-if-today L && /root/myscript.sh

# every third tuesday
30 6 * * 2 root run-if-today 3 && /root/myscript.sh

관련 정보