32

我正在尝试使用 rbenv 和 cron 运行 Ruby 脚本。我知道我需要加载 rbenv 才能加载正确的 Ruby 版本。

我试过这样的选择:

*/10 * * * * /bin/bash -c 'source $HOME/.bashrc; cd /数据/应用程序;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'

它也没有工作。然后我写了一个加载器,它只在当前shell中加载rbenv但它不起作用。

*/1 * * * * /bin/bash -c '$HOME/.rbenv/loader.sh ; cd /数据/应用程序/;ruby -v ' >> /tmp/logfile.txt 2>&1

现在我正在寻找另一种加载方式……有什么想法吗?

4

5 回答 5

46

我找到了加载 rbenv 的解决方案。使用加载器将 rbenv 导入 PATH :

*/1 * * * * /bin/bash -c '. $HOME/.rbenv/loader.sh ; cd /数据/应用程序/;红宝石-v'

这 '。' 在 '$HOME/.rbenv/loader.sh' 很重要之前,它会在当前 shell 中运行脚本

或者没有加载器,哪个更好:

*/1 * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd /数据/应用程序/;红宝石-v'

于 2011-12-09T10:30:33.273 回答
18

更好的解决方案是简单地使用 commandbash -lc命令。这将读取您的 bash 配置文件,该文件将设置 rbenv。从bash手册页:

-l 使 bash 像作为登录 shell 被调用一样

当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。当 shell 启动时,可以使用 --noprofile 选项来禁止这种行为。

于 2012-04-18T21:06:33.677 回答
3

即使 kmmndr 的回答是正确的,我也喜欢bash -l- 方法。

打开非交互式登录 shell 让事情变得更简单,因为我的 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_profileof中有适当的行/etc/profile.d/*)。

如果您需要更多详细信息,我写了一篇关于此主题的博客文章。

于 2014-08-25T21:28:15.810 回答
2

对于我在 Ruby 中的备份脚本,我只需使用~/.rbenv/bin/rbenv exec ruby [options] /path/to/ruby/script.rb. 尝试这个:

* * * * * ~/.rbenv/bin/rbenv exec ruby -v > ~/rbenv-ruby-version.txt
于 2016-06-23T19:32:40.290 回答
2

@Kelvin 的这个回答对我有用:

*/1 * * * * PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH ruby -v >> ~/test.out
于 2017-01-27T21:48:23.040 回答