【问题标题】:why #!/usr/bin/env ruby doesn't work in crontab?为什么 #!/usr/bin/env ruby​​ 在 crontab 中不起作用?
【发布时间】:2011-07-11 15:00:25
【问题描述】:

我已经通过 rvm(系统范围)安装了 ruby​​,并且通过普通控制台正常工作,并且我的 rails 程序在 rails runnerapache2+passenger 上都正常运行。

现在在一个 crontab 中,我调用了rails runner foo.bar,它放弃了,仔细检查我看到的日志:

/usr/bin/env: ruby: No such file or directory

有人知道为什么 /usr/bin/env 在 crontab 中不起作用吗?

【问题讨论】:

    标签: ruby ruby-on-rails-3 crontab


    【解决方案1】:

    如果您通过 rvm 安装 ruby​​,ruby 可能不在 /usr/bin 中。取决于 rvm 的安装位置:

    bash -c "source /usr/local/lib/rvm" && rails runner foo.bar
    

    您可能在 bashrc 中添加了一个源 */rvm,它是正确的 rvm 加载脚本。

    【讨论】:

    • 我找到了原因:ruby 没有在 crontab shell 中注册。我做了以下操作: /bin/bash -c "source /usr/local/rvm/src/rvm/scripts/rvm && /root/a/a_rails/script/rails runner Foo.bar"
    【解决方案2】:

    您的 cron 没有继承您的环境。尝试将“$PATH”回显到文件以查看它的设置。

    你也可以只做“PATH=/usr/bin/ruby && foo.rb”

    【讨论】:

    • /usr/bin/ruby foo.rb吗?将$PATH 设置为文件名而不是目录列表不会很好地工作。
    【解决方案3】:

    我遇到了类似的问题。默认情况下,Cron 似乎在不使用用户期望的 PATH 设置的情况下运行命令(以该用户身份登录时)。事实上,它甚至似乎没有使用任何默认的 PATH 设置(无论是在 /etc/profile 还是其他地方)。

    我能够使用以下命令找到问题(第一个是 cron 似乎如何运行命令):

    su -c 'printenv PATH' userX

    带输出:/usr/local/bin:/usr/bin:/bin:/usr/games

    su -l userX -c 'printenv PATH'

    带输出:/opt/ruby-enterprise-1.8.7-2010.02/bin/:/opt/ruby-enterprise-1.8.7-2010.02/bin/:/usr/local/bin:/usr/bin: /bin:/usr/游戏

    第一个命令似乎没有以任何方式填充 PATH 变量,除了裸系统默认值。 在我的情况下,我通过将必要的(REE)路径添加到:/etc/login.defs 来解决它,默认情况下如下所示:

    /etc/login.defs:103:ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

    【讨论】:

    • 你需要提供所有的ruby env,如果你使用rvm,你需要导出所有的GEM,GEM_HOME和PATH信息
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 2014-02-21
    • 1970-01-01
    • 2014-03-03
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多