[automation] 매월 말일에 실행할 CRON 작업

매월 말일에 실행할 CRON 작업을 만들어야합니다. cPanel을 사용하여 만들겠습니다.

도움을 주시면 감사하겠습니다. 감사



답변

아마도 가장 쉬운 방법은 세 가지 개별 작업을 수행하는 것입니다.

55 23 30 4,6,9,11        * myjob.sh
55 23 31 1,3,5,7,8,10,12 * myjob.sh
55 23 28 2               * myjob.sh

그러나 윤년에도 불구하고 2 월 28 일에 실행되므로 문제가 발생하면 다른 방법을 찾아야합니다.


그러나 일반적으로 다음과 같이 매월 1 일에 가능한 한 빨리 작업을 실행하는 것이 훨씬 쉽고 정확합니다 .

0 0 1 * * myjob.sh

그리고 처리 할 수있는 스크립트를 수정 이전 달의 데이터를.

이렇게하면 해당 월의 마지막 날짜를 파악하는 데 발생할 수있는 번거 로움이 제거되고 데이터를 처리한다고 가정 할 때 해당 월의 모든 데이터를 사용할 수 있습니다. 매월 마지막 날 5 분에서 자정까지 달리면 그 때부터 자정 사이에 발생하는 모든 것이 누락되는 것을 볼 수 있습니다.

이것은 대부분의 월말 작업에서이를 수행하는 일반적인 방법입니다.


당신은 여전히하면 정말 달의 마지막 날에 그것을 실행하려면, 하나의 옵션은 내일 (스크립트의 일부로하거나, 또는 crontab을 자체) 첫 번째 경우 단순히 감지하는 것입니다.

따라서 다음과 같습니다.

55 23 28-31 * * [[ "$(date --date=tomorrow +\%d)" == "01" ]] && myjob.sh

비교적 지능적인 date프로그램 이 있다고 가정하면 좋은 시작이 될 것 입니다.

date프로그램이 상대적인 날짜를 제공 할만큼 충분히 발전하지 않은 경우 다음 과 같이 내일의 날을 제공하는 매우 간단한 프로그램을 구성 할 수 있습니다 (의 전체 기능이 필요하지 않음 date).

#include <stdio.h>
#include <time.h>

int main (void) {
    // Get today, somewhere around midday (no DST issues).

    time_t noonish = time (0);
    struct tm *localtm = localtime (&noonish);
    localtm->tm_hour = 12;

    // Add one day (86,400 seconds).

    noonish = mktime (localtm) + 86400;
    localtm = localtime (&noonish);

    // Output just day of month.

    printf ("%d\n", localtm->tm_mday);

    return 0;
}

그런 다음 사용합니다 ( tomdom“내일의 날”로 불렀다고 가정 ).

55 23 28-31 * * [[ "$(tomdom)" == "1" ]] && myjob.sh

당신은 모두 이후 오류 검사를 추가하는 것을 고려할 수 있지만 time()mktime()반환 할 수 있습니다 -1뭔가 잘못되면. 위의 코드는 단순성 때문에이를 고려하지 않았습니다.


답변

위의 방법 중 하나와 비슷하게 사용할 수있는 약간 더 짧은 방법이 있습니다. 그건:

[ $(date -d +1day +%d) -eq 1 ] && echo "last day of month"

또한 crontab 항목은 28 일에서 31 일까지만 확인하도록 업데이트 될 수 있습니다. 다른 날에는 무의미하게 실행되기 때문입니다. 당신에게 줄 것 :

0 23 28-31 * * [ $(date -d +1day +%d) -eq 1 ] && myscript.sh


답변

매월 1 일에 실행되도록 크론 작업을 설정합니다. 그런 다음 시스템 시계를 하루 앞당기도록 변경합니다.


답변

위키피디아 이후 이건 어때?

55 23 L * * /full/path/to/command


답변

paxdiablo의 솔루션을 적용 하여 2 월 28 일과 29 일에 실행합니다 . 29 일의 데이터가 28 일을 덮어 씁니다.

# min  hr  date     month          dow
  55   23  31     1,3,5,7,8,10,12   * /path/monthly_copy_data.sh
  55   23  30     4,6,9,11          * /path/monthly_copy_data.sh
  55   23  28,29  2                 * /path/monthly_copy_data.sh


답변

매월 매일 실행되도록 cron 작업을 설정하고 다음과 같은 쉘 스크립트를 실행하도록 할 수 있습니다. 이 스크립트는 내일이 오늘보다 적은지 (예 : 내일이 새 달인 경우) 확인한 다음 원하는대로 수행합니다.

TODAY=`date +%d`
TOMORROW=`date +%d -d "1 day"`

# See if tomorrow's day is less than today's
if [ $TOMORROW -lt $TODAY ]; then
echo "This is the last day of the month"
# Do stuff...
fi


답변

@Indie 솔루션을 기반으로하는 crontab에서 더 안전한 방법 ( date+에 대한 절대 경로 사용 $()은 모든 crontab 시스템에서 작동하지 않음) :

0 23 28-31 * * [ `/bin/date -d +1day +\%d` -eq 1 ] && myscript.sh