Cron Là Gì?
Cron là hệ thống lập lịch job có sẵn Linux & MacOS. Chạy bất kỳ chương trình nào tại thời điểm cho trước. Bao gồm code Ruby! Nếu có task định kỳ muốn chạy tự động mỗi ngày, tuần hoặc giờ, Cron có thể là thứ bạn cần. Ví dụ task: Backup DB hàng tuần, tạo báo cáo hoạt động web hàng ngày, gửi email nhắc nhở.
Hãy khám phá làm cron work cho bạn!
Cơ Bản Của Cron
Mỗi user có file cron định nghĩa task muốn chạy. Edit file với crontab -e. Liệt kê task với crontab -l. Ví dụ cron job:
0 0 * * * /opt/rubies/ruby-2.5.1/bin/rake db:backupCú pháp hơi tricky & có thể không muốn edit thủ công luôn. Có gem làm dễ dàng? Có!
Cách Dùng Gem Whenever
Vì cron syntax khó nhớ, dùng gem whenever. Gem giúp định nghĩa cron job bằng Ruby. Cài gem trước. Sau đó, tạo file config: wheneverize . # [add] config/schedule.rb. Mở lên. Thấy ví dụ commented, xóa nếu muốn. Giả sử muốn backup job chạy mỗi giờ. Viết trong "config/schedule.rb":
every 1.hour do rake "db:backup" endOptions:
- rake (chạy rake task project,
db:backupkhông default, thửdb:version) - runner (Ruby class + method, như
Archive.backup_now) - command (system command)
whenever --update-crontab generate cron entry. Xem entry mới với crontab -l. Kết quả: 0 * * * * /bin/bash -l -c 'cd /home/jesus/testing && RAILS_ENV=production bundle exec rake db:backup --silent'Chú ý task chạy mode
production. Muốn đổi? Dùng setting: set :environment, "development" trong schedule.rb đầu file. Hoặc command: whenever --update-crontab --set environment=development. Tạo task với environment "development" khi chạy command.
Thêm Ví Dụ Whenever
Ví dụ cụ thể hơn. Task hàng tuần:
every :monday, at: "6:00 PM" do runner "Mail.send_weekly_newsletter" endChạy task 2 lần/ngày:
every :day, at: ["12:00 AM", "12:00 PM"] do command "rm tmp/testing.txt" end
Logging & Troubleshooting Whenever
Đã có task trong crontab (check crontab -l) sẵn sàng. Làm sao biết task chạy đúng? Setup logging & đọc output. Enable log thêm đầu schedule.rb. Config: set :output, "log/cron.log". Nhớ chạy whenever --update-crontab mỗi lần đổi! Log file vẫn rỗng? Đợi đến giờ scheduled. Nếu thấy error log:
/bin/bash: bundle: command not foundNghĩa cron không chạy Ruby version giống bạn. Nếu dùng Ruby version manager: Load từ
.bash_profile thay .bashrc, để cron task dùng được.
Alternative Cho Whenever
Whenever maintained tốt & work great. Nhưng alternative? Danh sách:
- Heroku Scheduler, free add-on Heroku user. Không flexible như cron nhưng làm việc
- Rufus Scheduler, gem Ruby thay cron bằng in-memory scheduler
- Sidecloq & Sidekiq-cron, cả hai add-on Sidekiq thêm recurring task vào Sidekiq
Tóm Tắt
Bạn đã học lập lịch cron job dùng gem whenever trong Ruby! Hãy chia sẻ để nhiều người hưởng lợi. Cảm ơn bạn đã đọc.