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"?
我已经解决了这个问题.
有两个问题,如Cron错误输出中所报告的:
expr: syntax error
Could not find rake-0.8.7 in any of the sources
Run Code Online (Sandbox Code Playgroud)
这是我在谷歌搜索和调试后修复它们的方法:
这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
修复语法错误后,我继续收到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之间存在差异.
| 归档时间: |
|
| 查看次数: |
1706 次 |
| 最近记录: |