매월 말일에 실행할 CRON 작업을 만들어야합니다. cPanel을 사용하여 만들겠습니다.
도움을 주시면 감사하겠습니다. 감사
매월 말일에 실행할 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
/bin/sh: -c: line 1: unexpected EOF while looking for matching ')'
.
[ $(date -d +1day +\%d) -eq 1 ] && run_job
매월 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
,29
.
55 23 28 2
아닙니까?
매월 매일 실행되도록 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
일부 cron 구현은 해당 월의 마지막 날을 나타내는 "L"플래그를 지원합니다.
이러한 구현 중 하나를 사용하는 것이 운이 좋다면 다음과 같이 간단합니다.
0 55 23 L * ?
매월 마지막 날 오후 11시 55 분에 실행됩니다.
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
#########################################################
# Memory Aid
# environment HOME=$HOME SHELL=$SHELL LOGNAME=$LOGNAME PATH=$PATH
#########################################################
#
# string meaning
# ------ -------
# @reboot Run once, at startup.
# @yearly Run once a year, "0 0 1 1 *".
# @annually (same as @yearly)
# @monthly Run once a month, "0 0 1 * *".
# @weekly Run once a week, "0 0 * * 0".
# @daily Run once a day, "0 0 * * *".
# @midnight (same as @daily)
# @hourly Run once an hour, "0 * * * *".
#mm hh Mday Mon Dow CMD # minute, hour, month-day month DayofW CMD
#........................................Minute of the hour
#| .................................Hour in the day (0..23)
#| | .........................Day of month, 1..31 (mon,tue,wed)
#| | | .................Month (1.12) Jan, Feb.. Dec
#| | | | ........day of the week 0-6 7==0
#| | | | | |command to be executed
#V V V V V V
* * 28-31 * * [ `date -d +'1 day' +\%d` -eq 1 ] && echo "Tomorrow is the first today now is `date`" >> ~/message
1 0 1 * * rm -f ~/message
* * 28-31 * * [ `date -d +'1 day' +\%d` -eq 1 ] && echo "HOME=$HOME LOGNAME=$LOGNAME SHELL = $SHELL PATH=$PATH"
하나의 cron 줄에 모든 답변을 연결하고 date
명령 만 사용할 수 있습니다.
오늘과 내일이 될 월의 차이를 확인하십시오.
0 23 * * * root [ $(expr $(date +\%d -d '1 days') - $(date +\%d) ) -le 0 ] && echo true
이 차이가 0 미만이면 월을 변경하고 해당 월의 마지막 날이 있음을 의미합니다.
55 23 28-31 * * echo "[ $(date -d +1day +%d) -eq 1 ] && my.sh" | /bin/bash