[Crontab] [Tip] Crontab 이슈 해결
crontab
을 써보면서 겪었던 몇 가지 이슈
를 해결하는 과정을 기록하려 한다.
자주 사용하시는 분들은 당연하게 생각하는 것들을 몰랐던 나는 검색을 통해 해결했는데, trouble shooting 을 하는 다른 분들께도 도움이 되었으면 좋겠다.
Permission denied
1
*/30 * * * * ./my.sh
이런식으로 crontab을 30분 간격으로 실행되도록 등록했다.
그런데 아무런 변화가 없었다.
그래서 로그
를 살펴보았다.
Crontab log
/var/log/cron 에 기록이 되며 root
권한이기 때문에
1
sudo tail -f /var/log/cron
이런식으로 확인하면 되겠다.
그런데 나같은 경우는 파일의 권한
이
-rw-r–r–.(744)
로 되어있었는데, 이 부분을 755로 변경해주니 permission denied
이슈는 해결되었다.
Crontab 실행 shell 로그 찍기
permission denied 는 해결하였는데, 계속 실행이 안되었다.
그래서 crontab으로 실행하는 쉘 스크립트의 로그를 찍어보았다.
요 부분은
(crontab -e)
1
*/30 * * * * ./my.sh >> {LOG_DIR}/cron.log 2>&1
이런식으로 로그를 직접 저장을 하면서 확인을 하면 되겠다.
그래서 내가 확인한 이슈
는 다음과 같다.
Command not found
1
kubectl not found
현재 수행하는 로직은 Crontab -> Shell -> Python 을 수행하고 있다.
Python 에서는 subprocess call을 통해서 kubectl을 불러오는데, 이 부분에서 command not found
에러가 발생하였다.
이유는 이러하다.
우리가 서버를 접속하거나 탭을 켜게 되면 자동으로 ~/.bash_profile 혹은 ~/.bashrc 가 실행이 된다. 이를 통해서 필요한 환경변수
들을 불러오게 된다.
하지만 crontab을 통한 실행에서는 환경변수를 가지고 가지 않는다. 따라서 여러 가지 환경변수들을 crontab
에 직접 저장을 해주어야한다.
대표적으로 /usr/local/bin 이 그러하다.
crontab 의 기본 PATH
는 /usr/bin
이다. 즉, /usr/local/bin
등 다른 경로에 있는 command에 대해서는 crontab이 인식하지 못한다.
1
2
$ which kubectl
$ /usr/local/bin/kubectl
이라고 뜨는 것을 확인할 수 있다.
따라서 아래처럼 crontab -e 를 통해 편집 탭에서 환경변수
를 직접 넣어주어야한다.
1
2
3
4
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
LD_LIBRARY_PATH=/usr/local/lib
* * * * * my_command.sh some_args
Python 로그 안찍힘
마지막으로는 Python
로그가 찍히지 않는 이슈이다.
위에서 언급한 것 처럼 나는
Crontab -> Shell -> Python
로 작업을 수행했는데, Python 에서 loguru 모듈을 통해 찍고 있는 로그가 저장이 안되는 이슈가 발생하였다.
아마 crontab에서 수행하다 보니 경로
가 꼬인 것으로 확인되는데,,,
그래서 나는 그냥 crontab의 결과 값을 다시 한번 로그로 저장하도록 구현했다.
1
* * * * * my_command.sh >> {LOG_DIR}/logs/cron_$(date +\%Y\%m\%d\%H\%M\%S).log 2>&1
로그
가 찍힐 때의 날짜 및 시간을 저장하기 위해서 Shell 스크립트 문법인 $(date +\%Y\%m\%d\%H\%M\%S) date
를 사용하였다.
요 부분은 디렉토리가 꼬여서 저장이 안되고 있었던 것으로 확인되었다. 즉, 정상적으로 파이썬 로그는 찍힘.