Как решить проблему с тем, что cron не выполняет данный скрипт - или другой? - PullRequest
4 голосов
/ 03 марта 2009

У меня есть скрипт 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.

Так что мои вопросы ...

  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'

Добавление определенного исполняемого файла 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

Ответы [ 3 ]

7 голосов
/ 03 марта 2009

По умолчанию 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

>> перенаправляет стандартный вывод в файл, а 2>&1 перенаправляет стандартный вывод на стандартный вывод, поэтому любые сообщения об ошибках также регистрируются.

Сделав это, вы сможете просмотреть сообщения об ошибках, чтобы увидеть, что на самом деле происходит.

1 голос
/ 03 марта 2009

Обычная проблема, когда кто-то обнаруживает, что его скрипт не запускается в задании cron, когда он запускается из командной строки, состоит в том, что он опирается на некоторую часть среды, которая есть в интерактивном сеансе, но не получает cron. Некоторыми частыми кандидатами являются среда «PATH» и, возможно, «HOME».

0 голосов
/ 10 сентября 2010

В Linux убедитесь, что все файлы конфигурации (/ etc / crontab, /etc/crond. enjdaily,hourly,etc‹/* и /etc/cron.d/*) доступны для записи только пользователю root и не символические ссылки, иначе они даже не будут рассматриваться.

Чтобы разрешить некорневые и / или символические ссылки, укажите параметр -p для демона crond.

...