【问题标题】:Ruby on Rails - Rake task not working through CronRuby on Rails - Rake 任务无法通过 Cron 运行
【发布时间】:2011-03-04 14:00:18
【问题描述】:

当我手动执行 rake 任务时,它工作正常,但是当我在 Cron 中输入相同的命令时没有任何反应:

cd /path/to/my/rails/app && rake daily_import

Cron 日志表明该命令有问题:

CMD (cd /path/to/my/rails/app && rake daily_import)

rake 任务记录错误和成功消息,但没有记录到日志中,什么也没做。但是,如果我使用相同的用户复制并粘贴 CMD 的文本,Cron 正在运行该命令,一切正常。

我假设在 Cron 中运行任务应该与在自己中输入相同,这样对吗?

【问题讨论】:

    标签: ruby-on-rails cron rake


    【解决方案1】:

    这东西对我有用

    * * * * * /bin/bash -l -c 'cd /path/to/my/rails/app && RAILS_ENV=production bundle exec rake daily_import'
    

    你需要在你的任务之前指定 /bin/bash -l -c。

    【讨论】:

      【解决方案2】:

      查找 cron 守护程序可能已发送给运行 cron 作业的用户的邮件。如果 cron 作业在 stderr 或 stdout 上产生输出,则 cron 守护程序会将其通过电子邮件发送给 cron 作业的所有者。如果出现问题(可能是因为路径问题,就像 Rob 上面建议的那样),您可能会在来自 cron 守护进程的电子邮件中看到有用的错误消息。

      【讨论】:

        【解决方案3】:

        如果有人使用 Rails 3.24.0 来查看这个,我必须在我的 crontab 中使用它:

        0 * * * * BUNDLE_GEMFILE=/path/to/rails/Gemfile /path/to/bin/bundle exec rake -f /path/to/rails/Rakefile db:hive_enrich RAILS_ENV=production > /var/log/rake_tasks.log 2>&1 &
        

        【讨论】:

          【解决方案4】:

          以下解决方案适用于 Rails 3 和 rvm 集成。我只是执行一个 bash 脚本:

          0 * * * * rvmuser /bin/bash -l -c '/path/to/my/bashscript > /tmp/script.log'
          

          如果没有 /bin/bash -l -c 部分,这似乎不起作用。

          那么,我的bash脚本如下,根据rvm documentation

          #!/usr/bin/env bash
          
          RAILS_ENV=production
          
          source /var/www/rvmuser/.rvm/environments/ruby-1.9.3-p484
          
          cd /path/to/my/rails_app
          
          rake do:whatever
          

          【讨论】:

            【解决方案5】:

            用于运行此 shell 的 cron 用户的 PATH 中是否有 rake?

            【讨论】:

            • 您可以尝试在您的任务中设置完整路径(例如,/usr/bin/rake)。此外,您可能必须使用 RAILS_ENV=production 指定 rails 环境。
            • 它没有设置,但添加后我仍然得到相同的结果。也尝试了electronaut的建议,结果相同。
            【解决方案6】:

            我使用以下格式运行 rake 任务,路径更加明确

            0 * * * * /usr/bin/rake -f /path/to/Rakefile daily_import RAILS_ENV=production
            

            我还喜欢将输出重定向到文件,以便检查错误

            0 * * * * /usr/bin/rake -f /path/to/Rakefile daily_import RAILS_ENV=production > ~/daily_import.log 2>&1
            

            【讨论】:

              猜你喜欢
              • 2016-11-03
              • 2012-09-02
              • 1970-01-01
              • 1970-01-01
              • 2011-02-09
              • 1970-01-01
              • 1970-01-01
              • 2014-05-27
              • 2011-02-04
              相关资源
              最近更新 更多