Как устранить проблему, связанную с тем, что cron не выполняет данный скрипт или другой?

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

Вопрос

У меня есть сценарий 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 утра. rootcrontab:

$ 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
Это было полезно?

Решение

По умолчанию 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 перенаправляет stderr на stdout, поэтому любые сообщения об ошибках также будут регистрироваться.

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

Другие советы

Обычная проблема, когда кто-то обнаруживает, что его сценарий не запускается в задании cron, когда он запускается из командной строки, заключается в том, что он полагается на некоторую часть среды, которая есть в интерактивном сеансе, но недоступна cron.Некоторыми частыми кандидатами являются среда «ПУТЬ» и, возможно, «ДОМ».

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top