Cron运行rake任务“在任何来源都找不到rake-0.8.7”

时间:2011-11-08 01:14:02

标签: cron rake bundle ubuntu-10.04

我正在尝试设置运行rake任务的cron作业。我正在使用宝石。以下是config / schedule.rb

中的配置
every 1.minutes do
  bundle exec rake "test:pick_participant"
end

每当正确设置crontab:

* * * * * /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

但是,每次运行作业时,Cron都会(通过邮件)报告此错误:

From: root@SEQUOIA.local (Cron Daemon)
To: jsmith@SEQUOIA
Subject: Cron <jsmith@SEQUOIA> /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <MAILTO=jsmith@SEQUOIA>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/jsmith>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=jsmith>
Message-Id: <20111108002602.98F3E60227C@SEQUOIA.local>
Date: Mon,  7 Nov 2011 16:26:01 -0800 (PST)
expr: syntax error
Could not find rake-0.8.7 in any of the sources

应用程序环境中捆绑的rake是0.8.7版。

Cron发出的命令似乎是正确的:

/bin/bash -l -c 'cd /home/jsmith/webapp/releases/2067320376 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

它直接调用bundle exec rake而不是rake

此外,如果我在应用程序目录内的命令行发出相同的命令,则rake任务会成功运行:

jsmith@SEQUOIA:~/webapp/current$ /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'

* picked participant: Mindy!

任何人都有任何想法为什么Cron遇到这个错误“找不到rake-0.8.7”?

2 个答案:

答案 0 :(得分:7)

我已经解决了这个问题。

有两个问题,如Cron错误输出中所报告的那样:

expr: syntax error
Could not find rake-0.8.7 in any of the sources

这是我在谷歌搜索和调试后修复它们的方法:

  1. exp: syntax error特定于我的Ubuntu 10.4 LTS安装。要解决此问题,请在文件/etc/profile.d/speechd-user-port.sh中替换

    export SPEECHD_PORT=$(expr 6560 + $(getent passwd $USER | cut -f 3 -d :))
    

    [ "$PS1" != "" ] && export SPEECHD_PORT=$(expr 6560 + $(getent passwd $USER | cut -f 3 -d :))
    

    变量扩展$ USER导致语法错误。这是Ubuntu 10.4的语音调度程序包中的一个错误。请参阅此处的详细说明:

    Ubuntu bug#790173 Cron doesn't send output properly Comment 6

    Ubuntu bug#601114 /etc/profile.d/speechd-user-port.sh references $USER

  2. 修复语法错误后,我继续收到Could not find rake-0.8.7 in any of the sources错误。

    这是因为我的登录会话中没有加载RVM。这行来源于rvm函数

    [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
    

    只在〜/ .bashrc中,而不是在〜/ .bash_profile中。

    为交互式非登录shell加载文件〜/ .bashrc,并为登录shell加载〜/ .bash_profile,这是由Cron作业命令中的-l开关加载的“/ bin / bash -l“

    这是我的错。 RVM website明确声明将行放在〜/ .bash_profile中。

    将行添加到〜/ .bash_profile,Cron作业成功加载RVM环境。现在,我的Cron rake任务工作顺利。

  3. 以下是我在调试问题时学到的一些事项:

    • Cron作业环境与登录shell的命令行不同。 Cron环境更加简单,并且没有像登录shell那样加载很多路径/配置文件。这就是为什么命令可以在命令行中工作,但不能作为Cron工作。

    • 删除Ruby on Rails和rake,我调试了Cron运行最简单的命令,并使用crontab条目,如下所示:

      * * * * * /bin/bash -l -c 'pwd’
      * * * * * /bin/bash -l -c 'echo $PATH’
      

      或者在Whenever的config / schedule.rb

      every 1.minutes do
        rake "--version"
        command "rvm info"
      end
      

      这些简单的命令让我意识到“expr:syntax error”与Cron或RoR无关,而rake错误是由于RVM没有正确加载。

    • .bashrc and .bash_profile之间存在差异。

答案 1 :(得分:0)

您可以随时使用CRON加载RVM环境,然后您应该能够运行任何rake任务,如下所示:

0 * * * * /home/user/.rvm/bin/rvm use ree-1.8.7-2011.03 rake name:task

其中ree-1.8.7-2011.03是要加载的gemset的名称,请键入rvm list以查看您的gemsets。在crontab中使用脚本文件而不是单行代码可以更容易管理,您也可以在脚本文件中使用上面的命令。