crontab은 기본적으로 분, 시간, 일, 월, 요일 단위로 주기를 설정할 수 있다. 단순한 주기 설정은 기본 설정만으로도 충분히 가능하지만, 매 달 세 번째 일요일 실행 등과 같은 조건은 설정에 한계가 있다.
그렇다면 이런 주기 설정은 어떻게 해야 할까?
이 문제는 매주 특정 요일에 실행하도록 crontab에 설정하고, 실행 시점의 날짜를 체크하는 방식으로 해결할 수 있다.
방법
1. crontab 주기 설정
* * * * 7
테스트하기 쉽도록 일요일인 경우에는 매 시 매 분 실행하도록 설정했다.
2. 날짜 체크
* * * * 7 [ $(date +\%d) -gt 14 ] && [ $(date +\%d) -le 21 ] && /run/your/script.sh
&&를 이용해 매 달 세 번째 주에만 스크립트를 실행하도록 실행 조건을 준다.
검증
그런데 저렇게 조건을 주면 정말 세 번째 주에만 실행이 될까? 확인해보고자 터미널에서 실행을 해보았다.
14일 이상 21일 이하일 경우 ls 명령을 실행하도록 명령어를 주었을 때는 정상적으로 실행이 되었다. 하지만 애초에 동시 만족이 불가능하도록 14일 이상 1일 이하일 경우 ls 명령을 실행하도록 명령어를 주었을 때는 ls 명령이 실행되지 않은 것을 확인할 수 있다.
마찬가지로 crontab에서도 동일한지 확인해보고자, 두 명령어 모두 등록을 해보았다.
먼저 세 번째 주에만 실행하도록 등록해둔 명령어는 결과 파일인 result.txt가 잘 확인되었다.
하지만 동시 만족이 불가능하도록 조건을 준 경우에는,
실행되지 않아 결과 파일인 result2.txt가 생성되지 않은 것을 확인할 수 있다.