Задача Cron не может загрузить драгоценный камень
У меня есть ruby script, который подключается к ведро Amazon S3 и загружает последнюю производственную резервную копию. Я тестировал script (что очень просто), и он отлично работает.
Однако, когда я планирую, что этот script запускается как задание cron, он, кажется, терпит неудачу, когда он загружает драгоценный камень Amazon (aws-s3).
Первые несколько строк моего script выглядят следующим образом:
#!/usr/bin/env ruby
require 'aws/s3'
Как я уже сказал, когда я запускаю этот script вручную, он отлично работает. Когда я запускаю его с помощью запланированного задания cron, он терпит неудачу, когда он пытается загрузить драгоценный камень:
`require ': нет такого файла для загрузки - aws/s3 (LoadError)
Crontab для этого script выглядит следующим образом:
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1
Я изначально думал, что это может быть потому, что cron работает как другой пользователь, но когда я делаю "whoami" в начале моего ruby script, он говорит мне, что он работает как тот же пользователь, которого я всегда использую.
Я также выполнил инициализацию пакета и добавил gem в свой gemfile, но это, похоже, не влияет.
Почему cron не загружает драгоценный камень? Я запускаю Ubuntu.
Ответы
Ответ 1
Если вы запускаете его вручную, и это работает, вы, вероятно, находитесь в другой среде оболочки, чем работает cron. Поскольку вы упоминаете, что вы работаете в Ubuntu, задания cron, вероятно, выполняются в /bin/sh, и вы 'вручную их запускать в /bin/ bash, если вы ничего не изменили.
Вы можете отлаживать проблемы с вашей средой или вы можете изменить оболочку, над которой работает ваша работа.
Отладка. Существует несколько способов выяснить, какие оболочки используют ваши задания cron. Его можно определить в
/etc/crontab
или вы можете сделать задание cron для сброса информации о вашей оболочке и окружающей среде, как было упомянуто в этом ответе SO: Как имитировать среду cron выполняет script с?
Чтобы переключиться на эту оболочку и увидеть фактические ошибки, вызвавшие неудачу вашего задания, выполните
sudo su
env -i <path to shell> (e.g. /bin/sh)
Затем, запустив script, вы увидите, что такое ошибки и сможете их исправить (rubygems?).
Вариант 2 - это переключение оболочек. Вы всегда можете попробовать что-то вроде:
0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1'
Чтобы заставить свою работу работать в bash. Это могло бы также прояснить ситуацию.
Ответ 2
Как уже упоминалось здесь https://coderwall.com/p/vhv8aw, вы можете просто попробовать
rvm cron setup # let RMV do your cron settings
Убедитесь, что вы делаете копию своего crontab перед запуском этой команды
Ответ 3
Вы также можете явно указать путь Gem:
GEM_HOME="/usr/local/rvm/gems/[email protected]"
Ответ 4
Добавьте это в начало вашего cron
PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/home/user/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/user/.rvm/bin:/home/user/.local/bin:/home/user/bin"
GEM_HOME='/home/user/.rvm/gems/ruby-2.1.4'
GEM_PATH='/home/user/.rvm/gems/ruby-2.1.4:/home/user/.rvm/gems/[email protected]'
MY_RUBY_HOME='/home/user/.rvm/rubies/ruby-2.1.4'
IRBRC='/home/user/.rvm/rubies/ruby-2.1.4/.irbrc'
RUBY_VERSION='ruby-2.1.4'
Ответ 5
в среде non cron выполните echo $PATH
, скопируйте путь и вставьте его в свой crontab перед вашей командой:
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
и внутри crontab:
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1