매월 특정 날짜에 cronjob을 실행하고 주말인 경우 더 일찍 실행합니다.

매월 특정 날짜에 cronjob을 실행하고 주말인 경우 더 일찍 실행합니다.

매달 20일 오전 6시에 스크립트를 실행하는 cronjob이 있습니다.

0 6 20 * * /opt/example.sh

예상대로 작동하지만 20일이 토요일이나 일요일이면 스크립트가 일찍 실행되도록 조정하고 싶습니다. 예를 들어:

스크립트는 2021년 2월 20일에 실행될 예정이지만, 오늘이 토요일이므로 19일 금요일에 실행됩니다. 마찬가지로 스크립트는 2022년 2월 20일에 실행되도록 예정되어 있지만 이날은 일요일이므로 18일 금요일에 실행됩니다.

cronjob 자체를 사용하여 이를 수행하는 옵션이나 트릭을 찾을 수 없습니다. 사용 가능한 대체 단일 값(예: SUN의 경우 crontab의 일요일)을 사용하는 몇 가지 트릭을 찾고 싶습니다.

내 생각에는 이것이 스크립트 자체에서 구현되어야 한다고 생각합니다.

예를 들어 18일에 실행하고 주말이 오지 않는 한 20일까지 스크립트 내에서 실행(휴면)을 연기할 수 있습니다. 이것은 나에게 오류가 발생하기 쉬운 것 같습니다. 아니면 18일, 19일, 20일에 실행을 예약하고 스크립트의 날짜를 확인하여 내 의도와 일치하는지 확인하는 아이디어가 있습니다.

cron 자체를 사용하여 이를 달성할 수 있는 방법이 있습니까?

답변1

다음과 같이 실행 18,19,20하고 현재 날짜를 확인할 수 있습니다.

0 6 18,19,20 * * case $(LC_ALL=C date +\%a\%d) in (Sat*|Sun*);; (Fri18|Fri19|*20) /opt/example.sh; esac

토요일이나 일요일이 아니면 20일이 허용되고, 금요일이면 18일이나 19일이 허용됩니다.

답변2

runsometimes.sh다음 내용으로 스크립트를 작성하겠습니다 .

#!/bin/bash
if [ $(date +%d) -eq 18 && $(date +%A) == "Friday" ] ; then/opt/example.sh ; exit ; fi
if [ $(date +%d) -eq 19 && $(date +%A) == "Friday" ] ; then /opt/example.sh ; exit; fi
if [ $(date +%d) -eq 20 ] ; then /opt/example.sh ; fi

그리고 cron이 매일 테스트하는지 확인하세요.0 6 * * * runsometimes.sh

몇 가지 참고사항:

  • 제가 작성한 스크립트는 예상보다 길기 때문에 조건을 결합하여 1개의 "if-then-fi"로 범위를 좁힐 수 있습니다. 그냥 읽기 편해서 이렇게 썼어요
  • else"좋은 스타일"은 대신 을 사용해야 한다고 지시 exit하지만, 다시 한 번 말하지만, 이것이 읽기 더 쉽다고 생각합니다.
  • 답변을 빠르게 작성했습니다. 테스트가 없으니, 사용 전 꼭 테스트 해보세요!
  • 귀하의 시스템이 영어 로케일을 사용한다고 가정합니다(다시 말하지만 읽기가 더 쉽습니다). "올바르게" 수행하려면 $(date +%u) -eq 5대신에 다음을 사용하십시오.$(date +%A) == Friday

편집하다: 질문 전체를 읽지 않았고 cron만 사용하여 달성하려는 내용을 놓쳤습니다. 이건 불가능할 것 같아...

관련 정보