12/08/2018, 13:59

Lập lịch Cron Jobs với gem whenever

Đôi khi, chúng ta phải chạy các công việc trong khoảng thời gian đặc biệt như: sao lưu bản ghi, gửi email, vv. Trong các hệ thống Unix, chúng ta có thể lập lịch công việc bằng cách sử dụng cron daemon. Cron là một daemon, dụng để thực hiện các nhiệm vụ theo lịch trình. Các hệ thống Unix cung cấp ...

Đôi khi, chúng ta phải chạy các công việc trong khoảng thời gian đặc biệt như: sao lưu bản ghi, gửi email, vv. Trong các hệ thống Unix, chúng ta có thể lập lịch công việc bằng cách sử dụng cron daemon. Cron là một daemon, dụng để thực hiện các nhiệm vụ theo lịch trình. Các hệ thống Unix cung cấp một lệnh, được gọi là crontab, cho phép người dùng cá nhân để tạo ra các nhiệm vụ theo lịch trình.

Cron sẽ tìm kiếm trong folder spool (/var/spool/cron/crontabs) các file crontab và tải chúng vào bộ nhớ. Các tập tin trong thư mục này không nên được truy cập trực tiếp mà nên dùng lệnh crontab để truy cập và cập nhật chúng. Sử dụng lệnh sau để chỉnh sửa file crontab của riêng bạn:

$ crontab -e

Giả sử bạn muốn backup file log của bạn mỗi ngày vào lúc 1:20 sáng thì thêm dòng sau vào file crontab:

20 1 * * * *  /path/to/your/backup/script.sh

Cron sử dụng 10 1 * * * * để tìm ra lịch trình để thực hiện công việc. Để hiểu định dạng này:

* * * * * *

| | | | | |

| | | | | +-- Năm(Giới hạn: 1900-3000)

| | | | +---- Ngày trong tuần(Giới hạn: 1-7, 1 bắt đầu từ thứ 2)

| | | +------ Tháng trong năm(Giới hạn: 1-12)

| | +-------- Ngày trong tháng(Giới hạn: 1-31)

| +---------- Giờ(Giới hạn: 0-23, trong ví dụ là 1)

+------------ Phút(Giới hạn: 0-59, trong ví dụ là 20)

Việc sửa trực tiếp file cron thì thực sự là rất khó khăn, thay vào đó, gem whenever sẽ giúp bạn

Cùng bắt đầu với ví dụ gửi mail hàng ngày cho user

# file: app/mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  def digest_email_update(options)
    # ... email sending logic goes here
  end
end

Việc gửi email cần được thực hiện thành 1 quá trình riêng biệt, chúng ta hãy tạo 1 file Rake gửi email. Thêm một file mới tên email_tasks.take trong thư mục lib/tasks của ứng dụng rails

# file: lib/tasks/email_tasks.rake

desc 'send digest email'
task send_digest_email: :environment do
  # ... set options if any
  UserMailer.digest_email_update(options).deliver!
end

send_digest_email: :environment nghĩa là để tải các môi trường Rails trước khi chạy các nhiệm vụ, vì vậy bạn có thể truy cập vào các class (như UserMailer) bên trong task.

Bây giờ, chạy rake -T lệnh sẽ liệt kê các Rake task mới được tạo ra. Kiểm tra tất cả mọi thứ hoạt động bằng cách chạy các task và kiểm tra xem các email được gửi hay không.

$ rake send_digest_email

# Gemfile

gem 'whenever', :require => false

$ bundle

Lệnh:

$ wheneverize .

sẽ tạo file config/schedule.rb

# file config/schedule.rb

every :day, at: "1:20am" do

# specify the task name as a string

  rake "send_digest_email"
end

Chạy lệnh:

$ whenever

sẽ ra một bản xem trước của task trong định dạng cron thực tế:

20 1 * * * /bin/bash -l -c 'cd /home/o-o/Work/testapp && RAILS_ENV=production bundle exec rake send_digest_email --silent'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated

## [message] Run `whenever --help' for more options

Để tạo lịch trình và ghi vào crontab, chạy lệnh:

$ whenever -w

[write] crontab file written

Điều ngày có nghĩa crontab đã được cập nhật, bạn có thể kiểm tra file crontab bằng lệnh

$ crontab -e

Đề xóa crontab bạn tạo ra:

$ whenever -c

[write] crontab file

continue...

0