'crontab'에 해당되는 글 1건

  분명 규칙에 맞게 했는데 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 을 설정하는 방법은 아래와 같습니다.

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
  위의 내용은 이 링크의 내용 기반으로 작성하였습니다.

  그리고 가장 중요한 것이 있는데 crontab -e 또는 vim /etc/crontab 를 통해 저장하고 난 이후 service crond restart 를 해야하는 것입니다. 새로운 작업을 등록해 놓고 서비스를 다시 시작하지 않으면 적용이 되지 않기 때문입니다.


PS.

  이건 제가 직접 해보지 않아서 확실하지 않은 방법입니다만, 명령어들을 crontab에 직접 입력하는 것이 아닌 쉘 파일에서 작성한 후 crontab에서 그 쉘을 실행시키는 것입니다. 이렇게 하면 제대로 실행된다고 하는데 제 생각으로는 저 방법이 자동으로 SHELL=/bin/bash 를 자동으로 해주기 때문인 것 같습니다.

  위 내용의 출처는 여기입니다. 



+ 추가  (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
블로그 이미지

NCookie

,