【发布时间】:2014-10-02 22:26:30
【问题描述】:
在我的 Rails 3.2 应用程序中,我有一个自定义 rake 任务,我每天下午 5 点尝试使用 cron 作业运行该任务。现在我正在我们网站的登台服务器上运行它。 cron 作业设置正确,但根据 cron 守护程序的电子邮件输出,rake 正在中止,因为它正在尝试调用 sqlite3。
这是我的 cron 工作:
#crontab
0 17 * * * cd /u/apps/my_app/current && /usr/local/bin/rake my_task
我已预留 sqlite3 用于开发和测试,如下所示:
#Gemfile
group :development, :test do
gem 'factory_girl_rails'
gem 'letter_opener'
gem 'rspec-rails'
gem 'sqlite3'
gem 'thin'
gem 'pry-rails'
end
我还设置了我的 rake 任务以加载正确的环境,如下所示:
#mytask.rake
task :my_task => :environment do
# my task
end
这是我从 crond 收到的电子邮件中的错误:
rake aborted!
Please install the sqlite3 adapter: `gem install activerecord-sqlite3-adapter` (sqlite3 is not part of the bundle. Add it to Gemfile.)
如果我直接从 shell 运行 rake 任务,我不会收到错误消息。这似乎是因为~/.bashrc 中的以下行:
alias rake='RAILS_ENV=staging rake'
但是,当从 cron 作业运行时,这似乎对任务没有任何影响。我尝试按照推荐的here 将export RAILS_ENV=staging 添加到.bashrc 文件,但没有帮助。
我发现的一件事是这样编写 cron 作业:
#crontab
0 17 * * * cd /u/apps/my_app/current && /usr/local/bin/rake my_task RAILS_ENV=staging
...直接在 cron 命令中使用 env 声明。这看起来不是很优雅,但现在还可以。有没有更好的方法来解决这个问题?
【问题讨论】:
-
0 17 * * * cd /u/apps/my_app/current && export RAILS_ENV=stage /usr/local/bin/rake my_task怎么样? -
我目前的解决方案是一样的,只是在cron作业的第二个命令末尾添加了env声明。我希望找到一种方法来设置它,所以我不需要为每个 cron 作业任务声明它。
-
sqlite3在 Gemfile 的暂存部分是否可用?如果你运行RAILS_ENV=staging rake my_task会成功吗? (我想不是)。另外,您确定您的 SQLite 仅限于开发和测试吗?您是否为此设置了配置文件? -
@xlembouras 如果我直接从 shell 运行 rake 任务,我不会收到错误消息。在
crontab -e的 rake 任务中添加“RAILS_ENV=staging”也可以解决问题,但我正在寻找一种不必在每个 cron 作业中声明的方法。
标签: ruby-on-rails shell cron rake environment