
매달 12일에 실행될 crontab 작업을 예약하는 데 도움을 줄 수 있는 사람이 있나요? 12일이 주말이면 다음 월요일에 실행되어야 합니다.
인터넷에서 뭔가를 찾았지만 작동하지 않습니다
0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command
이것이 ChatGPT가 나에게 준 것입니다. 이 문제를 디버깅하는 방법을 모르겠습니다.
답변1
나의 일반적인 추천cron이 제공하는 제한된 구문으로 일정의 형식을 간단하게 지정할 수 없는 경우 매우 복잡한 cron 명령을 생성하려고 시도해서는 안 된다는 것입니다.
해결 방법: 필요한 것보다 (약간) 더 자주 일정을 실행한 다음 배치 작업이나 훨씬 더 풍부한 환경이 있는 래퍼 셸 스크립트에서 "복잡한" 논리가 필요합니다. 일괄 처리 실행이 허용되면 작업을 실행하고 그렇지 않으면 정상적으로 종료합니다.
예
cron에서는 배치가 항상 12일, 13일, 14일에 실행되는 래퍼 스크립트에서 실행되거나 매일 실행되도록 허용하도록 예약합니다.
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
25 4 12,13,14 * * /path/to/your/wrapper.script
# or even:
25 4 * * * /path/to/your/wrapper.script
그런 다음 해당 래퍼 셸 스크립트에서 논리를 적용합니다.
오늘이 12 일 이고 평일인 경우:
ELSE 작업을 정상적으로 종료합니다.오늘이 13 일 이고 월요일인 경우:
(12 일 이 일요일이고 작업 실행이 허용되지 않음)
작업을 실행합니다. ELSE 정상적으로 종료합니다.오늘이 14 일 이고 월요일인 경우:
(12 일 이 토요일이고 작업 실행이 허용되지 않음)
작업을 실행합니다. ELSE 정상적으로 종료합니다.
그러면 Bash /path/to/your/wrapper.script
스크립트는 다음과 같이 보일 수 있습니다.
#!/bin/bash
# Wrapper script that will run_batch() on the 12th when
# the 12th is a weekday, otherwise the following Monday
run_batch () {
# Add the real job here
echo "The job has started"
}
TODAY=$(date +%d)
# date +%u day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)
if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then
run_batch
elif [ "${TODAY}" -eq 13 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
else
exit
fi