프로그램

crontab 이 정상 실행 안 될 때.

(주)CKBcorp., 2015. 1. 21. 06:30
반응형





linux 에서 정기적인 작업 실행을 위한 corn.

cron 의 사용법은 인터넷 검색 해서 알아보고.... 

나는 크론 안 되는 경우를 좀 적겠다.


daemon 을 하나 만들어서 정기적으로 실행시키려고 cron 에 등록했는데, 아무리 해도 안되더라.


아래와 같은 내용을 확인해 보아야 한다. 


1. cron 은 1분 이하의 정기적 실행은 불가능.

분해능이 1분이다. 



2. cron을 매 분, 매 시간 실행시키는 것과, 매 시각 1분, 매일 1시에만 실행시키는 것은 다르다.


예를 들어, 


1 * * * * /home/foo.sh


는 매 분마다 foo.sh 를 실행시키는 게 아니고, 매 1 분마다 foo.sh 를 실행시킨다는 뜻으로, 

한 시간에 cron 이 60번 실행된다는 뜻이 아니라, 한시간에 1회만, 매 시각 01 분에만 실행된다. 

물론 


* 1 * * * /home/foo.sh


이것도 마찬가지. 하루 중 매 01 시 에만 60회 실행된다.


예를 들어 매 분, 하루 1440회 ( 60 * 24 )  실행하려 한다면 


1 * * * * /home/foo.sh

* * * * * /home/foo.sh


가 맞다. 


하루 한 시간마다 실행하려 한다면, 


01 * * * * /home/foo.sh


이 맞다. 



3. 왜인지는 모르겠지만, /etc/crontab 에 등록하는 것과 crontab -e 로 등록하는 것의 동작이 다르다.

직접 테스트 해 보고 알게 된 건데,

crontab 의 동작을 설정할 때, 설정파일인 


root# vi /etc/crontab 


의 내용을 설정하는 것과


root# crontab -e


로  설정하는 게 동작이 다르다.


이건 왜인지 모르겠다. 

테스트를 통해서 다르다는 것만 확인했고, 왜 저런 일이 발생하는지 까지는 모르겠다.


추가 : 인터넷 뒤져보다 얻어걸렸다. 

vi 로 설정파일 설정하는 것과 crontab -e 로 설정하는 경우, 실행되는 계정 권한이 다르다고 한다. 

그러므로 /etc/crontab 파일에 설정할 때에는, 각 스크립트의 계정 권한 설정을 잊지말것.

root# crontab -e 으로 실행할 때는 그럴 필요 없다.


자세한 내용은 http://egloos.zum.com/limjh77/v/10511993 를 참조.


4. cron 으로 작업할 땐 절대경로. 환경변수 설정 잊지말자. 

흔히 하기 쉬운 실수 중 하나. 테스트는 상대경로 ( 혹은 경로 확인 없이 그냥 ) 로 해 놓고 실행하지 말 것.


참고로 cron 을 실행했을 때의 실행 경로는, 해당 계정의 경로가 된다.

만약 root 로 실행하고 상대경로 / 절대경로 설정을 안 했다면, ( current path ) , /root/ 아래에 결과 파일들이 생성된다.

로그는 /var/log/cron  에 생성되므로, 이상하면 해당 파일을 살펴볼 것.


5. 실행할 내용은 , 되도록 shell 로 만들것.

예제로 설명하자.

너님이 하루 한  번 일괄작업을 할 파일을 daily.exe 로 만들었다고 치자.

그럼 cron 으로 등록할 때


01 01 * * * /home/daily/daily.exe 


로 등록할 거다.


이런 식으로 하지 말라는 거다. 

실행 파일을 직접 cron 에 등록하지 말고,

이걸 shell 로 감싼다음 등록하란 뜻. 예를 들어 /home/daily/cronDaily.sh 를 만든다음


cronDaily.sh 내용:


#!/bin/bash

/home/daily/daily.exe


이렇게 만들어 놓고, 크론에는


01 01 * * * /home/daily/cronDaily.sh


이렇게 등록하란 뜻.


왜인지는 모르겠지만, 실행파일을 직접 등록하면 안 됐던 게 저렇게 shell 로 감싼 후 등록하니까 실행됐다.


6. service crond restart 

혹시나 해서. 

기껏 cron 작업 등록해 놓고, cron 데몬을 재 실행 안하면, 의미없다. service crond restart  로 반드시 재실행 해 주도록 하자.




삽질 끝.





 


반응형