如何通过cron运行rake任务?

6

我有一个 Rails 应用程序和一个 rake 任务,我打算每小时在 cron 中执行一次。但问题是,该任务使用 Rails 环境和我的 Rails 应用程序的某些类。如果我将其作为 Ruby 脚本运行,我将不得不包含它所使用的所有依赖项,并且我认为无法以正确和简单的方式完成。因此,我必须将其作为 rake 任务运行,因为这将保留所有依赖项,对吗?那么如何从 cron 运行 rake 任务呢?

请注意,当没有必要使用任何第三方解决方案时,我更喜欢不使用 gem whenever 或类似的东西。


当您从控制台运行它时,要使其工作,您需要键入什么?您可以将完全相同的命令字符串放入您的crontab中。 - Taryn East
无论何时结账,都会大大简化生活 :-) https://github.com/javan/whenever - Stan Brajewski
请检查此链接:https://dev59.com/Uo3da4cB1Zd3GeqPviJY - Ricardo Vigatti
3个回答

21

你可以在crontab中添加类似以下内容的内容

0 * * * * /bin/bash -l -c 'cd /path/to/your/project && bundle exec rake foo:bar >> log/cron.log 2>&1'

这将每小时运行foo:bar任务,并将stdoutstderr写入log/cron.log
请注意在rake命令之前使用bundle exec
使用bundler确保任务获取正确的环境。

要指定RAILS_ENV,可以执行以下操作

... && RAILS_ENV=production bundle exec rake foo:bar

4

2
这里有一个rake任务的示例:
task :foo => :environment do
  puts "Running rake task in environment: #{Rails.env}"
  # can access Models here or whatever
end

请注意,=> :environment 部分是可选的,但它能让你的Rails环境适用于任务块。
你可以在你的cron job中加入 rake run_my_task
你可能需要使用类似 cd /home/$USER/my_rails app && rake run_my_task 的命令来确保cron从Rails根目录运行该任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接