분명 규칙에 맞게 했는데 crontab이 정상적으로 실행되지 않는 경우가 있습니다. 그래서 인터넷으로 검색도 해보고 직접 실험도 해서 안 되는 이유를 찾아보았습니다.
원인
1. 환경변수
아마 대부분의 문제가 여기에 해당하지 않을까 생각합니다. cron은 별도로 쉘을 띄우기 때문에 프로그램을 실행하기 위해 관련된 환경변수들을 설정해야 한다고 합니다.
2. 권한 문제
crontab을 설정하는 방법에는 크게 두 가지가 있는데 하나는 /etc/crontab에서 직접 수정하는 것이고 나머지 하나는 crontab -e 명령을 통해 하는 것입니다.
이 중 vim /etc/crontab 에서 root 권한 명령어를 실행하기 위해서는 root 권한을 명시해줘야 합니다. 반면 crontab -e로 cron을 수정할 때에는 root 권한을 명시할 필요가 없습니다.
vim /etc/crontab */30 * * * * root /home/hello/test.sh
crontab -e */30 * * * * /home/hello/test.sh
3. 절대경로 / 상대경로
제가 이번에 프로젝트를 진행하면서 한 큰 실수가 있는데 바로 프로그램의 테스트와 config 파일을 상대경로로 해놓고 crontab 에서는 절대경로를 사용했었습니다. 그래서 테스트 할 때 절대경로로 했더니 오류가 뜨더군요;;
그렇기 때문에 crontab 에 추가하기 전에 절대경로로 먼저 테스트 해보시는 것을 추천합니다.
4. 최소 반복 시간
그리고 이건 거의 해당하는 일이 없으실거라 생각하는데 crontab의 최소 반복시간은 1분입니다. 따라서 그 보다 작은 시간으로 하려고 하면 당연히 안 되겠지요.
해결방법
지금부터 위의 오류들을 해결할 수 있는 방법들에 대해서 소개하겠습니다. 언어는 파이썬을 사용할 것입니다.
우선 환경 변수의 문제에 대해서 입니다. 위에서 언급했다시피 crontab은 별도의 쉘을 띄우기 때문에 별도의 환경변수 설정이 필요합니다. 자세한 내용은 여기에서 보시면 될 것 같습니다. 그리고 환경 변수를 설정하고 crontab 을 설정하는 방법은 아래와 같습니다.
1
2
SHELL=/bin/bash
*/10 * * * * source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command
쉘의 경로를 설정하고 10분마다 virtualenv를 activate 하고 manage.py 스크립트를 실행하는 코드입니다. 여기서 핵심은 첫 번째 줄의 SHELL=/bin/bash 이겠지요.
만약 프로젝트가 virtualenv 내에 있다면 파이썬의 경로를 명시해 줘야 할 수도 있을 것입니다.
위의 방법들로도 해결이 되지 않는다면 파이썬 스크립트의 맨 위에
#!/home/my/virtual/bin/python
/home/my/virtual/bin/python
python /home/my/project/manage.py > /path/to/cronlog.log 2 > &1
위 내용의 출처는 여기입니다.
+ 추가 (2016. 10. 30)
저 같은 경우에는 /etc/crontab 파일을 수정하여 프로세스를 등록하였고 환경변수를
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
와 같이 설정하였습니다.
'리눅스' 카테고리의 다른 글
[우분투] apt / apt-get 차이 (2) | 2016.12.25 |
---|---|
우분투 16.04 Octave 설치 (0) | 2016.12.09 |
[리눅스] ds, df (0) | 2016.12.02 |
[우분투] 멀티부팅 되지 않을 때 해결법 (0) | 2016.11.02 |
[리눅스] 반복 예약작업 crontab (0) | 2016.10.20 |