【问题标题】:Rake task has wrong environment within cron job on Openshift在 Openshift 的 cron 作业中,Rake 任务的环境错误
【发布时间】:2014-06-29 05:51:18
【问题描述】:

由于在 Redmine 应用程序中导入电子邮件,我正在尝试在 Openshift 上设置 cron 作业。因此,我准备了一个这样的详细脚本:

#!/bin/bash
rake RAILS_ENV=production -f ${OPENSHIFT_REPO_DIR}/Rakefile redmine:email:receive_imap host=imap.googlemail.com port=993 ssl=1 username=xxx@artistii.com password=yyy ...

在 ssh 连接上手动启动时运行没有问题。相反,当由 cron 运行时,找不到 rake。 做了一些调试,发现路径和登录shell不一样;即使我为 rake 使用了完整路径,发现的 ruby​​ 也是 1.8 版(不是 1.9 版),并且每当我设置与 shell 相同的路径时,都找不到 libruby-1.9。

根据其他一些建议,我尝试添加以下行来代替设置自定义 PATH:

source /usr/bin/rhcsh

但仍然没有找到 rake。我也尝试使用 bundle exec。

在 Openshift 上为 cron 设置环境以便它可以像登录 shell 一样运行的正确方法是什么?

【问题讨论】:

  • 在 shell 脚本中,尤其是在 cron 作业中,你永远不应该依赖 $PATH,你应该引用你绝对想要的 rake。这是一种安全措施,否则执行特权代码太简单了。这样也不会有路径问题。

标签: ruby cron openshift


【解决方案1】:

您可能需要 cd 到首先安装您的包的​​目录(您的 Gemfile 所在的目录),可能是这样的吗?

cd $OPENSHIFT_REPO_DIR && bundle exec rake .....

【讨论】:

    【解决方案2】:

    这是 cron 墨盒中的错误。你可以参考这个question in SO。这实际上是 Python 墨盒和 cron 墨盒的问题。但影响所有人的是 cron 墨盒。里面还提到了一个 OpenShift Bug Report。

    正如您所观察到的那样,该错误是 cron 墨盒使用 Ruby 1.8 而不是 Ruby 1.9。因此,使用 Ruby 1.9 安装的 gem 不适用于使用 Ruby 1.8 的 cron 墨盒。

    已经有针对此错误的错误修复,您可以参考 OpenShift 错误报告。但不太确定它是否已经推出。

    同时,有一个临时解决方法,即在 cron 脚本中导出 PATH 和 LD_LIBRARY_PATH。您可以参考 OpenShift 错误报告。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您使用的是 rvm,openshift 可能会遇到一些问题,无法切换到默认 rvm。您也可以尝试这样的操作,以便在运行 bundle 之前将 rvm 设置为默认值,并且还可以生成您的 cron 日志以获得准确的您的 cron 作业的状态:

      https://rvm.io/rvm/install

      使用 bundle exec 摆脱多个版本的 rake

      cd $OPENSHIFT_REPO_DIR && rvm gemset use "yourgemsetname" && RAILS_ENV=production bundle exec rake cron_job:cron_job --silent >> log/cron_log
      

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2014-05-27
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2021-05-13
        相关资源
        最近更新 更多