Подтвердить что ты не робот

Задача 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.

4b9b3361

Ответ 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