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

Ruby script с использованием rbenv в cron

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

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

*/10 * * * */bin/ bash -c 'source $HOME/.bashrc; cd/data/app; 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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Несмотря на то, что ответ kmmndr верен, мне также нравится bash -l -approach.

Открытие неинтерактивной оболочки входа упрощает работу, и поскольку мои приложения 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/*).

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

Ответ 4

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

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

Ответ 5

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

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