我正在尝试设置运行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”?
答案 0 :(得分:7)
我已经解决了这个问题。
有两个问题,如Cron错误输出中所报告的那样:
expr: syntax error
Could not find rake-0.8.7 in any of the sources
这是我在谷歌搜索和调试后修复它们的方法:
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
修复语法错误后,我继续收到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任务工作顺利。
以下是我在调试问题时学到的一些事项:
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中使用脚本文件而不是单行代码可以更容易管理,您也可以在脚本文件中使用上面的命令。