Cron은 특정 날짜에만 실행되지 않고 다른 모든 날짜에 실행됩니다.

Cron은 특정 날짜에만 실행되지 않고 다른 모든 날짜에 실행됩니다.

매일 밤 10시에 bash 스크립트를 실행하는 cron 설정이 있습니다. 매달 1일에 실행되는 또 다른 크론 설정이 있습니다. 두 크론 모두 bash 스크립트를 실행합니다. bash 스크립트의 유일한 차이점은 기본 Java 프로그램에 전달하는 매개변수입니다(Java 프로그램의 명령줄 실행 시뮬레이션).

문제는 매달 1일에 일일 크론을 어떻게든 비활성화해야 둘 다 같은 날 실행되지 않도록 해야 한다는 것입니다. 이 작업이 자동으로 수행될 수 있습니까?

첫 번째 스크립트 이전에 cron을 편집하고 백업을 설정한 후에 다시 bash 스크립트를 편집하기 위해 또 다른 bash 스크립트를 생성할 수 있다고 생각했지만 그것은... 깨끗하지 않은 것 같습니다.

답변1

주석에서 @StephaneChazelas가 제안한 솔루션과 유사하게, 매월 1일이 아닌 매일 cron을 실행하려는 세 번째 필드에 날짜 범위를 지정할 수 있습니다.

다음 두 항목이 작업을 완료합니다.

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash

답변2

이 문제를 처리하는 가장 쉬운 방법은 cron 항목을 하나만 갖는 것입니다. bash 스크립트를 수정하여 날짜를 확인하세요. 해당 월의 1일이면 월별 매개변수로 Java 프로그램을 호출하고, 그렇지 않으면 일일 매개변수로 프로그램을 호출하세요.

스크립트를 변경하면 cron 테이블에서 추가 정보를 요구하지 않고도 스크립트를 문서로 사용하여 현재 상황을 더 잘 설명할 수 있으므로 프로세스가 더 간단해집니다.

스크립트 모드는 다음과 같습니다:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi

답변3

if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

정수 비교를 사용하는 것이 더 정확할 것이라고 생각합니다.

date '+%d'는 1 대신 01을 반환하므로 ==를 사용한 문자열 비교는 false입니다.

대신에

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi

관련 정보