我有一个应用程序和一个rake任务,我将在一小时内由cron执行一次。但问题是该任务使用rails环境和我的rails应用程序的某些类。如果我将它作为ruby脚本运行,我将不得不包含它使用的所有依赖项,我认为不可能以一种简单的方式正确地执行它。因此,我必须将其作为rake任务运行,因为它会保留所有依赖项,对吧?那么如何从cron运行rake任务?
请注意,如果没有必要,我不想使用任何第三方解决方案,在这种情况下,我不想在任何时候使用gem。
答案 0 :(得分:13)
您可以在crontab中添加类似
的内容0 * * * * /bin/bash -l -c 'cd /path/to/your/project && bundle exec rake foo:bar >> log/cron.log 2>&1'
这将每小时运行一次foo:bar
任务,并将stdout
和stderr
写入log/cron.log
。
请在bundle exec
命令之前注意rake
使用bundler确保您的任务将获取正确的环境。
指定RAILS_ENV
即可
... && RAILS_ENV=production bundle exec rake foo:bar
答案 1 :(得分:2)
随时使用以简化您的生活https://github.com/javan/whenever;)
答案 2 :(得分:0)
这是rake任务的一个例子:
task :foo => :environment do
puts "Running rake task in environment: #{Rails.env}"
# can access Models here or whatever
end
请注意,=> :environment
部分是可选的,但是它使您的Rails环境成为任务块的原因。
您可以将rake run_my_task
放入您的cron作业中。
您可能需要使用类似cd /home/$USER/my_rails app && rake run_my_task
的内容来确保cron从Rails根目录运行任务。