2012-02-21 3 views
7

응용 프로그램의 가장 보편적 인 필요성은 매 X 분/시간마다 스크립트를 실행하는 것입니다. 기본적으로 PHP 코드와 crontab 엔트리가 복잡하지 않습니다.Cronjob - 올바른 방법으로하는 방법?

지난 몇 년 동안 나는 많은 cronjob을 작성했지만 아직 모범 사례를 보지 못했습니다. 모든 "백그라운드 처리"와 마찬가지로 많은 것들이 프로덕션 설정에서 특히 잘못 될 수 있습니다. 그 중

:

  • 오류가 크론의 실행 중에 발생하고 cronjob를 실수로 다른 프로세스에 의해 두 번 시작되었다
  • 스크립트는/무엇이든
  • 사용자 오류에 의해/데이터의 처리 반 사망
  • cronjob를 예상 다음 방법으로 이상했다과 등 데이터 처리
을 수행하지 않지만 스크립트는 다시 호출

견고하고 견고한 cronjob 스크립트를 작성하기위한 가장 좋은 방법은 무엇입니까? 단 하나의 인스턴스 만 실행한다고 주장하는 잠금 파일을 작성하면 수십만 개의 중복 전자 메일을 보내지 않도록 광범위한 로깅 및 모니터링을 수행 할 수 있습니까? 당신의 아이디어는 무엇입니까?

+0

내가 게시 한 것을 흥미롭게 읽은 이유는 내가 같은 것을 연구하고 궁금해했기 때문입니다. 필자의 경우, 필자가 작성한 쉘 스크립트에서 예외 처리를 효과적으로 구현하는 방법에 대해 정말로 우려하고있다. http : // stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting에는 흥미로운 경우를 대비하여 좋은 정보가 있습니다. 나는 주로 Java 개발자이고 예외 처리는 매우 강력하지만 * nix 영역에서는 더 어려워 보인다. –

+0

이것은 각각의 모든 스크립트 실행에 따라 달라질 것이고 일반적인 대답은 없으며 어떤 것은 아무런 필요성을 확인하지 않고 매우 강력한 오류를 필요로합니다 ... –

+0

나는이 질문을 자신의 장점과 단점에 대한 자세한 정당화와 함께 혁신적인 대답을 기대하면서 북마크했습니다. 그리고 "이것은 내가하는 일"답에 실망합니다. – nickb

답변

2

개인적으로 오류를 처리하는 방법은 단순히 STDERR을 로그 파일로 보내고 주기적으로 파일을 확인하는 것입니다. 이것을하기위한 쉬운 방법은 crontab 항목에 2>/pathtolog를 추가하는 것입니다.

동일한 프로그램이 중복 실행되는 한 스크립트에서 파일이나 로컬 네트워크 포트를 잠그려고합니다. 해당 잠금을 얻지 못하면 스크립트가 실행되지 않습니다. 이렇게하면 기존 스크립트가 현재 실행중인 경우 새로운 스크립트가 동일한 잠금을 얻을 수 없습니다.

0

할 수있는 일이 많이 있습니다.

귀하의 필요에 따라 소유자 나 그룹별로 실행 가능한 cron 스크립트/바이너리 (PHP로 작성된 것으로 추측되는 스크립트)를 설정하십시오.

cron에서만 실행되도록하려면 스크립트를 실행할 수있는 유일한 사용자 인 cron 사용자를 만드십시오. 그런 다음 해당 사용자가 crontab 항목에서 실행되도록 설정하십시오.

cron 스크립트에서 중요한 작업을 출력합니다. 타임 스탬프/날짜 스탬프 (출력 빈도에 따라 다름)를 미리 출력하십시오. 이렇게하면 로그 파일에서 특정 시간에 grep을 쉽게 수행 할 수 있습니다.

crontab 항목에 >> /path/cron.log을 추가하여 스크립트의 stdout을 로그 파일에 추가하십시오.

cronjob의 시작 시간과 종료 시간을 출력하여 잠시 동안 로그를 분석하여 프로세스가 너무 느리지 않도록 할 수 있습니다. 물론, 대신 두 임의 쿼리의 수행 어떤 일을 제외하고

[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Executing mycron.php 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 20, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 12324123) 
[ Tue Feb 20, 2012 ]: 
[ Tue Feb 20, 2012 ]: Finished executing mycron.php. Time taken: 3.462 seconds 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Executing mycron.php 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Running Query: ""SELECT SUM(`clicks`) FROM `matable`"" 
[ Tue Feb 21, 2012 ]: Running Query: ""INSERT INTO `History` (`date`, `total_clicks`) VALUES(CURDATE(), 10376123) 
[ Tue Feb 21, 2012 ]: 
[ Tue Feb 21, 2012 ]: Finished executing mycron.php. Time taken: 2.998 seconds 

:

귀하의 로그 파일과 같이 보일 수 있습니다.

+0

다른 cronjob의 로그를 확인하려면 cronjob을 사용해도되지만 실패하면 어떻게해야합니까? –