Home [Crontab] [Tip] Crontab 이슈 해결
Post
Cancel

[Crontab] [Tip] Crontab 이슈 해결

[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를 사용하였다.

요 부분은 디렉토리가 꼬여서 저장이 안되고 있었던 것으로 확인되었다. 즉, 정상적으로 파이썬 로그는 찍힘.

This post is licensed under CC BY 4.0 by the author.