我正在尝试使用rbenv和cron运行ruby脚本.我知道我需要加载rbenv才能加载正确的ruby版本.
我尝试过这样的选项:
*/10****/bin/bash -c'source $ HOME/.bashrc; cd/data/app; ruby -v'>> /tmp/logfile.txt 2>&1
但由于会话不是交互式的,我没有正确的ruby版本.我找到了这样的例子:
15 14 1**export 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/data/app /; ruby -v'>> /tmp/logfile.txt 2>&1
现在我正在寻找另一种加载它的方法......任何想法?
kmm*_*ndr 44
我找到了加载rbenv的解决方案.使用加载器将rbenv导入PATH:
*/1****/bin/bash -c'.$ HOME/.rbenv/loader.sh; cd/data/app /; ruby -v'
'.' 在'$ HOME/.rbenv/loader.sh'很重要之前,它在当前shell中运行脚本
或者没有装载机,哪个更好:
*/1****/bin/bash -c'export PATH ="$ HOME/.rbenv/bin:$ PATH"; eval"$(rbenv init - )"; cd/data/app /; ruby -v'
Joh*_*how 18
更好的解决方案是简单地使用命令bash -lc命令.这将读取您的bash配置文件,它将设置rbenv.从bash手册页:
-l使bash行为就好像它已被作为登录shell调用一样
当bash作为交互式登录shell或作为具有--login选项的非交互式shell调用时,它首先从文件/ etc/profile中读取并执行命令(如果该文件存在).在读取该文件之后,它按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令.启动shell以禁止此行为时,可以使用--noprofile选项.
尽管 kmmndr 的答案是正确的,但我也喜欢bash -l- 方法。
打开非交互式登录 shell 使事情变得更简单,并且由于我的 Rails 应用程序和 Ruby 脚本都在同一用户下运行,因此开销不是问题。
所以而不是
*/1 * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd /data/app/; ruby -v'
Run Code Online (Sandbox Code Playgroud)
我愿意
*/1 * * * * /bin/bash -lc 'cd /data/app/; ruby -v'
Run Code Online (Sandbox Code Playgroud)
正如上面的答案中所述,bash -l将像您正常登录一样运行,这意味着您的 rbenv 环境已经设置好(只要您的.bashrc, .bash_profileof中有适当的行/etc/profile.d/*)。
如果您需要更多详细信息,我写了一篇关于该主题的博客文章。