Gem Whenever

Whenever là một Ruby Gem cung cấp cú pháp rõ ràng cho việc viết và deploy các cron job.

Cài đặt

$ gem install whenever

Hoặc thêm vào Gemfile rồi bundle install:

gem 'whenever', :require => false

Sử dụng

$ cd /apps/my-great-project
$ wheneverize .

Lệnh trên sẽ tạo ra một file config/schedule.rb.

Whenever command

$ cd /apps/my-great-project
$ whenever

Lệnh này đơn giản là convert file schedule.rb thành cú pháp cron. Nó không đọc hoặc viết vào file crontab, bạn cần thực hiện lệnh sau:

$ whenever --update-crontab

Một số lựa chọn khác thường được sử dụng:

$ whenever --user app # set a user as which to install the crontab
$ whenever --load-file config/my_schedule.rb # set the schedule file
$ whenever --crontab-command 'sudo crontab` # override the crontab command

Bạn có thể liệt kê các cron job đã được cài đặt bằng cách dùng: crontab -l.

Chạy whenever --help sẽ cho ra một danh sách đầy đủ các tùy chọn cho việc chọn schedule để dùng, cài đặt các biến trong schedule, ...

Ví dụ file schedule.rb

every 3.hours do # 1.minute 1.day 1.week 1.month 1.year is also supported
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
  runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
  runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
  command "echo 'you can use raw cron syntax too'"
end

# run this task only on servers with the :app role in Capistrano
# see Capistrano roles section below
every :day, :at => '12:20am', :roles => [:app] do
  rake "app_server:task"
end

Xác định loại job

Whenever cung cấp ba loại job: command, runner, và rake. Bạn có thể xác định các job_type của mình.

Ví dụ:

job_type :awesome, '/usr/local/bin/awesome :task :fun_level'

every 2.hours do
  awesome "party", :fun_level => "extreme"
end

Lệnh trên sẽ chạy /usr/local/bin/awesome party extreme cứ hai giờ một lần. :task luôn luôn được thay thế bằng đối số đầu tiên, tiếp tục với các đối số tương ứng.

Các loại job_type mặc định được cung cấp bởi Whenever được định nghĩa như sau:

job_type :command, ":task :output"
job_type :rake,    "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner,  "cd :path && bin/rails runner -e :environment ':task' :output"
job_type :script,  "cd :path && :environment_variable=:environment bundle exec script/:task :output"

Nếu :path không được thiết lập, nó sẽ mặc định đường dẫn mà lệnh whenever đang thực thi. :environment_variable mặc định là RAILS_ENV. :environment mặc định là production. :output sẽ được thay thế với ouput redirection của bạn, co thể đọc thêm ở link : http://github.com/javan/whenever/wiki/Output-redirection-aka-logging-your-cron-jobs

Tất cả các job được mặc định chạy với bash -l -c 'command...'. Đọc thêm: http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production

Bạn có thể thay đổi điều này bằng cách cài đặt :job_template:

set :job_template, "bash -l -c ':job'"

Hoặc thiết lập job_template bằng nil để job của bạn được thực thi bình thường.


set :job_template, nil

Phân tích date và time

Whenever dùng gem Chronic để phân tích các date và time đặc biệt.

Bạn có thể thiết lập các tùy chọn của config Chronic nếu các mặc định không phù hợp.

Ví dụ, bạn muốn dùng đồng hồ 24 giờ thay thế cho loại mặc định là 12 giờ:

set :chronic_options, :hours24 => true

# By default this would run the job every day at 3pm
every 1.day, :at => '3:00' do
  runner "MyModel.nightly_archive_job"
end

Bạn có thể xem danh sách các tùy chọn ở link sau:

https://github.com/mojombo/chronic/blob/master/lib/chronic/parser.rb

Tùy chỉnh người nhận email với biến môi trường MAILTO

Output từ các job được gửi tới địa chỉ email cài đặt trong biến môi trường MAILTO.

Có nhiều cách để thiết lập người nhận:

Ví dụ: Thiết lập MAILTO cho toàn bộ job:

env 'MAILTO', '[email protected]'

every 3.hours do
  command "/usr/bin/my_great_command"
end

Ví dụ: Thiết lập MAILTO cho tất cả job trong cùng một bl:

every 3.hours, mailto: '[email protected]'  do
  command "/usr/bin/my_super_command"
end

Ví dụ: Một MAILTO thiết lập cho job riêng

every 3.hours do
  command "/usr/bin/my_super_command", mailto: '[email protected]'
end

Bài viết trên giới thiệu cơ bản về gem Whenever vói các tùy chọn dùng để deploy các cron tab. Bạn có thể nghiên cứu thêm ở tài liệu phía dưới.

Thank you!

Tài liệu dịch: https://github.com/javan/whenever