How to add schedule auto run rake task to rails
Bài đăng này đã không được cập nhật trong 8 năm
I. Introduction
- Sometimes, we must to run some task with schedule. Rails support us to do this by gem "whenerver" and rake task.
- Rake task will make somethings you want to do and it repeat manytimes, so you must to run rake task instead of rewrite your code.
- Gem "whenever" will make schedule to run your task auto and repeat.
II. Installation
Firstly, we need to install gem "whenever":
- Add to
Gemfile
gem "whenever"
- Run command
bundle install
III. Simple example
In this example, we want to create some notice to do to user every 2 days to remind their work. Then, we need to create a rake task and a schedule to do rake task:
1. Create rake task
We need to generate rake task by this command:
rails g task todos auto_create
create lib/tasks/todos.rake
It will generate our new rake task in file lib/tasks/todos.rake
with the contents:
namespace :todos do
desc "TODO"
task :auto_create => :environment do
end
end
Then, we need to add somethings we want to do in this task:
namespace :todos do
desc "Auto Register ToDo"
task auto_create: :environment do
User.visible.each do |user|
user.to_dos.create comment: "somethings to do"
end
end
end
By this way, we have a rake task to create to do for all user when run this command:
rake todos:auto_create
2. Create schedule to run rake task auto
Getting started with those command:
cd /apps/my-great-project
wheneverize .
After that, it will create an initial file: config/schedule.rb
In this file, you can create schedule easily by this simple code:
every 2.days do
rake "to_dos:auto_create"
end
That's enough for our simple example, but whenever gem can do more.
IV. More about whenever gem
- If include
require: false
aftergem "whenever"
onGemfile
, the gem will be installed, but won't be loaded into a process unless you explicitly callrequire "whenever"
. - It has many way to create schedule in the time you want, for example:
every 1.day, at: "5:00am" do
//something
end
every 5.minutes do
//something
end
every :hour do
//something
end
every :weekday do
//something
end
every :monday, at: "8:00am" do
//something
end
every :reboot do
//something
end
Or you can use this format:
every "* * * * *" do
//something
end
with meaning:
- min (0 - 59)
- hour (0 - 23)
- day of month (1 - 31)
- month (1 - 12)
- day of week (0 - 6) ~ (sunday = 0)
V. Conclusion
This is a good way to run some tasks auto and repeat with schedule in rails. I hope you find this article useful. Thanks for reading!
All rights reserved