首页 文章

在cron中使用rbenv的ruby脚本

提问于
浏览
30

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

现在我正在寻找另一种加载它的方法......任何想法?

5 回答

  • 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'
  • 1

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

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

  • 17

    即使kmmndr的答案是正确的,我也喜欢 bash -l -approach .

    打开非交互式登录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_profile/etc/profile.d/* 中有相应的行) .

    如果您需要更多细节,我写了关于这个主题的a blog post .

  • 2

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

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

    @Kelvin的回答为我工作:

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

相关问题