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
Теперь я ищу другой способ загрузить его... любую идею?
Ответы
Ответ 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