У меня есть скрипт Rails, который я хотел бы запускать ежедневно. Я знаю, что есть много подходов, и что некоторые люди не одобряют подход cron'd 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 часа утра. Crontab root
:
$ 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.
Так что мои вопросы ...
- Где еще я могу найти информацию для отладки этого?
- Может ли это быть проблемой 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'
Добавление определенного исполняемого файла Ruby к команде сделало свое дело:
$ 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