скрипт ruby с использованием rbenv в cron

Я пытаюсь запустить скрипт ruby, используя rbenv с cron. Я знаю, что мне нужно загрузить rbenv, чтобы загрузить правильную версию ruby.

Я пробовал такие варианты:

*/10 * * * * /bin / bash-c 'source $HOME/.bashrc; cd/data /app; ruby-v' > > /tmp / logfile.txt 2>&1

но поскольку сеанс не является интерактивным, у меня нет правильной версии ruby. Я нашел такой пример:

15 14 1 * * экспорт BASH_ENV= / path/to /environment & & /full/path/to/bash-c '/full/path/to / rvm_script.rb'

Он не работал neighter. Затем я написал загрузчик, который загружает только rbenv в текущую оболочку, но он не работает.

*/1 * * * * /бин/Баш-с '$HOME/.rbenv/loader.sh ; компакт-диск /данных/приложение/; Рубин -с V ' >> /tmp/и журнал.txt 2>&1

теперь я ищу другой способ, чтобы загрузить его ... есть идеи ?

5 ответов


Я нашел решение для загрузки rbenv. Либо с загрузчиком, импортирующим rbenv в путь:

*/1 * * * * /bin / bash-c'. $HOME/.rbenv/loader.sh ; cd / data / app/; ruby-v'

The '."до "$HOME/.rbenv/loader.sh ' важно, он запускает сценарий в текущей оболочке

или без загрузчика, что лучше:

*/1 * * * * /bin / bash-c 'путь экспорта=" $HOME/.rbenv / bin:$PATH"; eval " $(rbenv init -)"; cd / data / app/; ruby-v'


лучшее решение-просто используйте команду . Это прочитает ваш файл профиля bash, который установит rbenv. От bash man page:

- l заставить bash действовать так, как если бы он был вызван как оболочка входа

когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром --login, это сначала читает и выполняет команды из файла /etc/profile если этот файл существует. После чтение этого файла, он ищет ~/.файл, ~/.bash_login, and~/.profile, в этом порядке, и считывает и выполняет команды из первый, который существует и читаем. Параметр --noprofile может использоваться при запуске оболочки для ингибирования такое поведение.


хотя ответ kmmndr правильный, мне также нравится bash -l-подход.

Открытие неинтерактивной оболочки входа в систему упрощает работу, и поскольку мои приложения Rails и скрипты Ruby работают под одним пользователем, накладные расходы не являются проблемой.

так вместо

*/1 * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd /data/app/; ruby -v'

Я

*/1 * * * * /bin/bash -lc 'cd /data/app/; ruby -v'

как отмечено в приведенном выше ответе,bash -l будет действовать так, как будто вы входите в систему нормально, что означает, что ваша среда rbenv уже будет настроена (как пока у вас есть соответствующие строки в свой .bashrc, .bash_profile of /etc/profile.d/*).

Если вам нужно больше деталей, я написал блоге об этой теме.


для моего сценария резервного копирования в Ruby я просто использую ~/.rbenv/bin/rbenv exec ruby [options] /path/to/ruby/script.rb. Попробуйте это:

* * * * * ~/.rbenv/bin/rbenv exec ruby -v > ~/rbenv-ruby-version.txt

этот ответ от @Kelvin работал для меня:

*/1 * * * * PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH ruby -v >> ~/test.out