CRON이 주어진 스크립트를 실행하지 않은 문제를 디버깅하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/607599

문제

매일 달리는 레일 스크립트가 있습니다. 나는 많은 접근법이 있다는 것을 알고 있으며 script/runner 접근은 일부 사람들에 의해 눈살을 찌푸 렸지만 내 필요를 충족시키는 것 같습니다.

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

내 응용 프로그램은 /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

나는 그것을 실행하도록 설정했다 cron 매일 아침 오전 4시. 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)
...

그러나 로그 파일에는 항목이 없으며 업데이트 해야하는 데이터가 업데이트되지 않았습니다. 로그 파일 권한 (테스트로)은 전 세계적으로 쓰기 쉬운 것으로 설정되었습니다.

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

나는 Centos 5에서 달리고 있습니다.

그래서 내 질문은 ...

  1. 이것을 디버깅 할 정보를 어디서 찾을 수 있습니까?
  2. 이것이 Selinux 문제 일 수 있습니까? 이 오류를 해결할 수있는 설정 또는 변경할 수있는 보안 컨텍스트가 있습니까?

고맙습니다!

업데이트

폴과 누가 모두에게 감사합니다. 그것은 환경 문제로 판명되었고 stderr 로그 파일을 사용하면 오류를 찾을 수있었습니다.

$ 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'

명령에 특정 루비 실행 파일을 추가하면 다음과 같이했습니다.

$ 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
도움이 되었습니까?

해결책

기본적으로 Cron은 출력을 운영 한 사용자에게 우편으로 우편으로 발송합니다. 당신은 거기를 볼 수 있습니다.

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

STDOUT 및 STDERR을 로그 파일로 리디렉션하는 방법은 다음과 같습니다.

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

그만큼 >> stdout을 파일로 리디렉션하고 2>&1 stderr를 stdout으로 리디렉션하여 모든 오류 메시지도 기록됩니다.

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

다른 팁

누군가가 명령 줄에서 실행될 때 누군가 스크립트가 CRON 작업에서 실행되지 않는다는 것을 발견 할 때 일반적인 문제는 대화식 세션이 가지고있는 일부 환경에 의존하지만 CRON은 얻지 못한다는 것입니다. 일부 빈번한 후보자는 "경로"환경이며 아마도 "집"입니다.

Linux에서는 모든 구성 파일 (/etc/crontab, /etc/crond. (daily, hourly, etc}/and /etc/cron.d/*)이 사용자 루트에만 쓸 수 있으며 Symlinks가 아닌지 확인하십시오. 그렇지 않으면 그들은 고려되지 않을 것입니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top