在cron中使用rbenv的ruby脚本

kmm*_*ndr 31 ruby cron rbenv

我正在尝试使用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'

  • 请注意,您的加载器只需要包含`$ PATH`更改:`export PATH = $ HOME/.rbenv/bin:$ HOME/.rbenv/shims:$ PATH`.你甚至不需要cd,只需运行`ruby/data/app/script_name.rb`并且rbenv会找到正确的版本.如您所知,可以省略垫片路径(如果不需要). (4认同)

Joh*_*how 18

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

-l使bash行为就好像它已被作为登录shell调用一样

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

  • 我不建议这样做,因为如果`.bash_profile`等执行只有交互式shell需要的东西,它可能会增加很多开销.如果你给某些bash命令别名,你甚至可能会遇到麻烦. (4认同)
  • 不知怎的,这对我不起作用:( (3认同)

Mic*_*nek 5

尽管 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/*)。

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