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

Kar*_*n W 3 cron rake bundle ubuntu-10.04

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

every 1.minutes do
  bundle exec rake "test:pick_participant"
end
Run Code Online (Sandbox Code Playgroud)

每当以下时间正确设置crontab:

* * * * * /bin/bash -l -c 'cd /home/jsmith/webapp/releases/20111104200246 && RAILS_ENV=production bundle exec rake test:pick_participant --silent'
Run Code Online (Sandbox Code Playgroud)

但是,每次运行作业时,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
Run Code Online (Sandbox Code Playgroud)

应用程序环境中捆绑的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'
Run Code Online (Sandbox Code Playgroud)

它是直接呼叫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!
Run Code Online (Sandbox Code Playgroud)

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

Kar*_*n W 7

我已经解决了这个问题.

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

expr: syntax error
Could not find rake-0.8.7 in any of the sources
Run Code Online (Sandbox Code Playgroud)

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

  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 :))
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    Ubuntu bug#790173 Cron没有正确发送输出评论6

    Ubuntu bug#601114 /etc/profile.d/speechd-user-port.sh引用$ 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"
    
    Run Code Online (Sandbox Code Playgroud)

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

    为交互式非登录shell加载文件〜/ .bashrc,并为登录shell加载〜/ .bash_profile,这是-l交换机在Cron作业命令"/ bin/bash -l"中加载的内容

    这是我的错.该RVM网站明确指出投入〜/ .bash_profile中的线.

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

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

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

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

    * * * * * /bin/bash -l -c 'pwd’
    * * * * * /bin/bash -l -c 'echo $PATH’
    
    Run Code Online (Sandbox Code Playgroud)

    或者这些在Whenever的config/schedule.rb中

    every 1.minutes do
      rake "--version"
      command "rvm info"
    end
    
    Run Code Online (Sandbox Code Playgroud)

    这些简单的命令让我意识到"expr:语法错误"是与Cron或RoR无关的基础,而rake错误是由于RVM没有正确加载.

  • .bashrc和.bash_profile之间存在差异.