2009-03-03 9 views
4

나는 매일 실행하고 싶은 레일스 스크립트를 가지고있다. 나는 많은 접근 방식이 있다는 것을 알고 있으며, 어떤 사람들은 cron'd script/runner 접근 방식을 싫어하는 경향이 있지만 그것이 나의 필요를 충족시키는 것으로 보인다.cron이 특정 스크립트를 실행하지 않는 문제를 디버깅하는 방법 - 또는 다른 방법?

그러나 내 스크립트는 예정대로 실행되지 않습니다.

내 신청서는 /data/myapp/current이고, 스크립트는 script/myscript.rb입니다. 내가 가진 root로 문제없이 수동으로 실행할 수 있습니다 : 나는 그렇게 할 때

/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb 

, 특별 로그 파일 (log/myscript.log)이 예상대로에 기록됩니다 :

Tue Mar 03 13:16:00 -0500 2009 Starting to execute script... 
... 
Tue Mar 03 13:19:08 -0500 2009 Finished executing script in 188.075028 seconds 

나는 그것을 실행하도록 설정해야 매일 오전 4시에 cron입니다. root의 crontab을 : 오늘 아침처럼 최근에 실행하려고처럼 사실

$ crontab -l 
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb 

, 그것은 보인다!

$ tail -100 /var/log/cron 
... 
Mar 2 04:00:01 hostname crond[8894]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb) 
... 
Mar 3 04:00:01 hostname crond[22398]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb) 
... 

그러나 로그 파일에는 항목이 없으며 업데이트해야하는 데이터가 업데이트되지 않았습니다. (테스트)를 로그 파일 권한도 쓰기 전역으로 설정했다 : 나는 CentOS는 5.

를 실행하고

$ ls -lh 
total 19M 
... 
-rw-rw-rw- 1 myuser apps 7.4K Mar 3 13:19 myscript.log 
... 

그래서 내 질문은 ...

  1. 다른

    을 수행 할 수 있습니다 이 디버깅 정보를 찾으십시오?
  2. 이 문제가 SELinux 문제 일 수 있습니까? 이 오류를 해결할 수있는 보안 컨텍스트를 설정하거나 변경할 수 있습니까?

고맙습니다!

업데이트는 바울과 누가 복음 모두에게 감사합니다. 환경 문제로 판명 났으며 stderr을 로그 파일로 캡처하면 오류를 찾을 수있었습니다.

$ crontab -l 
0 4 * * * /usr/local/bin/ruby /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb >> /data/myapp/current/log/cron.log 2>&1 

답변

7

기본적으로 cron은 출력을 실행 한 사용자에게 메일을 보냅니다. 거기를 볼 수 있습니다.

서버에서 임의의 사용자의 로컬 메일 대신 로그 파일의 결과를 볼 수 있도록 cron으로 실행되는 스크립트의 출력을 리디렉션하는 것이 매우 유용합니다.여기

는 로그 파일에 표준 출력 및 표준 오류를 리디렉션 할 방법은 다음과 같습니다

cd /home/deploy/your_app/current; script/runner -e production ./script/my_cron_job.rb >> /home/deploy/your_app/current/log/my_file.log 2>&1 

>> 리디렉션 파일에 표준 출력 및과 2>&1 어떤 오류 메시지도 기록 할 수 있도록 표준 출력을 표준 오류 리디렉션합니다.

이 작업을 수행하면 오류 메시지를 검사하여 실제로 진행되고있는 작업을 확인할 수 있습니다.

1

누군가가 명령 줄에서 실행할 때 자신의 스크립트를 cron 작업에서 실행되지 않습니다 발견 일반적인 문제 : 명령에 특정 루비가 실행 추가

$ cat cron.log 
/usr/bin/env: ruby: No such file or directory 

$ head /data/myapp/current/script/runner 
#!/usr/bin/env ruby 
require File.dirname(__FILE__) + '/../config/boot' 
require 'commands/runner' 

는 속임수를 썼는지 그것은 대화식 세션이 있지만 cron이 얻지 못하는 환경의 일부에 의존한다는 것입니다. 몇몇 후보자는 "PATH"환경이며 가능하면 "HOME"입니다.

-1

Linux의 경우 모든 구성 파일 (/ etc/crontab, /etc/crond.{daily,hourly,etc}/* 및 /etc/cron.d/*)이 root 사용자에게만 쓰기 가능하고 기호 링크가 아닙니다. 그렇지 않으면 고려되지 않습니다.

비 루트 및/또는 심볼릭 링크를 허용하려면 crond 데몬에 -p 옵션을 지정하십시오.

+1

저는 몇 년 동안 debian & 우분투 (vixie cron)의 /etc/cron.d에 심볼릭 링크를 아무런 문제없이 사용해 왔습니다. 사실, vixie cron은 그런 옵션을 갖고 있지 않습니다. – graywh