скрипт ruby ​​с использованием rbenv в cron - PullRequest
31 голосов
/ 08 декабря 2011

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

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

* / 10 * * * * / bin / bash -c 'source $ HOME / .bashrc; CD / данные / приложение; ruby -v '>> /tmp/logfile.txt 2> & 1

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

15 14 1 * * export BASH_ENV = / path / to / environment && / full / path / to / bash -c '/full/path/to/rvm_script.rb'

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

* / 1 * * * * / bin / bash -c '$ HOME / .rbenv / loader.sh; cd / data / app /; ruby -v '>> /tmp/logfile.txt 2> & 1

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

Ответы [ 5 ]

44 голосов
/ 09 декабря 2011

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

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

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

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

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

18 голосов
/ 19 апреля 2012

Лучшее решение - просто использовать команду bash -lc command.Это прочитает ваш файл профиля bash, который установит rbenv.Со страницы руководства bash:

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

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

2 голосов
/ 26 августа 2014

Хотя ответ 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 из /etc/profile.d/*).

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

1 голос
/ 28 января 2017

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

*/1 * * * * PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH ruby -v >> ~/test.out
1 голос
/ 23 июня 2016

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

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