2010-01-17 30 views
16

Tôi hiện đang viết một ứng dụng để lấy thông tin mới từ các nguồn RSS và phải cập nhật các nguồn RSS đó trong một tần suất nhất định. Hiện tại tôi chỉ đang kéo khi người dùng yêu cầu nguồn cấp dữ liệu nhưng tôi muốn thay đổi hành vi đó thành tìm nạp định kỳ tự động.Các tác vụ định kỳ trong ứng dụng Ruby On Rails: Cron hoặc khác?

Tôi đã viết một shellscript tương tác với cơ sở dữ liệu và bắt đầu định kỳ thông qua cron - nhưng điều này là rất nhiều nỗ lực gấp đôi vì vậy tôi đã tự hỏi điều gì sẽ là "Rails Way" hoặc "Ruby Way" để làm điều này. Tôi đang sử dụng Ubuntu, Apache và Hành khách. Bạn có thể đề xuất các phương pháp tốt hơn có thể thậm chí được bao gồm trong ứng dụng, vì vậy tôi có thể dễ dàng triển khai ứng dụng sang một máy khác mà không cần phải trộn lẫn với cron không?

Trả lời

19

Tôi sẽ đề xuất thực hiện một công việc giống như công việc cào và sử dụng whenever gem để tạo công việc cron của bạn để chạy tác vụ rake.

Kiểm tra, http://railscasts.com/episodes/164-cron-in-ruby, để biết thêm thông tin về đá quý.

Lợi ích chính của whenever gem là nó giữ yêu cầu ứng dụng của bạn (tức là công việc cron chạy mỗi x giờ, trong ứng dụng) bên trong ứng dụng của bạn, tăng tính di động của ứng dụng của bạn.

1

Có nhiều giải pháp khác nhau. Để thiết lập đơn giản nhất, bạn có thể sử dụng script/runner trong thứ crontab của mình như sau:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname 

Tên phương thức phải là phương pháp tĩnh trên mô hình của bạn. Bạn cần tham khảo dự án theo đường dẫn đầy đủ, nếu không nó sẽ không được tìm thấy nhiều nhất trong môi trường cron. Kiểm tra trang crontab của bạn để biết thông tin về cú pháp crontab nếu bạn không quen thuộc. Ví dụ ở trên, chạy kịch bản ở phút thứ 10 của giờ thứ 0 hàng ngày (lúc 12:10 sáng).

Nếu bạn cần giải pháp mạnh hơn, bạn có thể sử dụng BackgroundRB. BackgroundRB chạy một daemon và hỗ trợ các tác vụ lên lịch và có thể đưa các kết quả vào cơ sở dữ liệu. Họ thậm chí có một giao thức truyền thông đơn giản để cho phép các quy trình web của bạn yêu cầu hoàn thành một nhiệm vụ, và sau đó có cách để lấy kết quả. Điều này cho phép bạn kiểm soát các công việc nền ngay từ giao diện web, chứ không phải là một crontab chỉ "xảy ra".

Có một thiết lập tốt hơn một chút cần thiết cho BackroundRB để làm việc, nhưng nó có thể là giá trị nó nếu công việc cần phải được kiểm soát.

6

Tôi khuyên bạn nên kết hợp cả hai bên trên. Bạn muốn có một công việc cào, ngay cả khi bạn có một phương pháp trực tiếp đã được tạo ra. Điều này là do máy chủ quản trị công cụ mà bạn muốn chạy trong cron, bạn cũng có thể muốn chạy từ dòng lệnh đôi khi, và đây là những gì rake nhiệm vụ là tốt cho.

Plugin bất cứ khi nào nghe có vẻ thú vị, mặc dù tôi không thể xác minh cho nó. Tất nhiên, bạn nên biết cách làm mọi thứ từ đầu, sau đó sử dụng các plugin để làm cho cuộc sống của bạn dễ dàng hơn. Đây là cách từ đầu.

Tạo một tập tin mới, lib/tasks/admin.rake

Bên trong, tạo ra các nhiệm vụ riêng của mình:

namespace :admin 
    desc "Updates all RSS feeds" 
    task :rss => :environment do 
    RssFeed.update_all 
    end 
end 

này giả định bạn có một lớp RSSFeed, và phương pháp update_all làm những gì bạn mong muốn.Bạn có thể gọi điều này từ dòng lệnh:

rake admin:rss 

Và bạn có thể thêm video này vào cron (bằng cách gọi crontab -l như là người dùng web) và thêm dòng này:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 
+1

Bạn có một điểm tốt trong việc biết cách thực hiện mọi việc theo cách thủ công. Lợi ích chính của bất cứ khi nào đá quý, như tôi đã chỉ ra ở trên, không chỉ là cú pháp viết một công việc cron sạch hơn, vì dsl nó sử dụng, nhưng nó cho phép bạn giữ yêu cầu kinh doanh đó (cron job), trong phiên bản kiểm soát với ứng dụng của bạn, theo cách đó khi thời gian đến mở rộng, bạn không phải đi săn qua tab cron, sao chép tab cron, lọc ra các công việc cron khác không liên quan đến ứng dụng của bạn, thay đổi đường dẫn, v.v. Bạn chỉ có thể tạo phần bổ sung cho crontab bằng đá quý. – Travis

+0

Tôi hoàn toàn đồng ý, và tôi chắc chắn sẽ kiểm tra đá quý đó cho bản thân mình! Bạn nói đúng, dự kiến ​​crons * nên * là một phần của ứng dụng, bao gồm trong kiểm soát phiên bản, vv Tôi chỉ nghĩ rằng tôi sẽ đóng góp một chút của một nền tảng. –

1

Hãy thử sử dụng whenever. Cuối cùng, nó sẽ tạo ra một cron, nhưng định nghĩa lập lịch sẽ được viết bên trong ứng dụng của bạn bằng Ruby DSL.

0

Đối với các nhóm nhỏ và dự án cá nhân, đá quý bất cứ khi nào là tuyệt vời. Nhưng nếu công ty của bạn có một nhóm ops tách biệt với nhóm phát triển, nó có thể không lý tưởng.

Tại công việc cuối cùng của tôi, nhóm ops cần có khả năng xem cron mà chúng tôi đã cài đặt để họ có thể tự tin rằng nó sẽ không có bất kỳ tác dụng phụ nào cho hệ thống. Vì vậy, một giải pháp DSL sẽ không hoạt động. Nhưng chúng tôi (các nhà phát triển) muốn các script cron trong điều khiển phiên bản.

Vì vậy, để thỏa hiệp, chúng tôi kiểm tra tập tin văn bản với cron liệu, tương tự như sau:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 

Và chúng tôi đã thêm một bước để kịch bản capistrano rằng cài đặt mà để crontab như một phần của triển khai.

+1

Khi nhập bất cứ khi nào trong ứng dụng đường ray của bạn, nó sẽ xuất ra các công việc cron. Không thể bạn chỉ cần đầu ra các công việc vào một tập tin cho nhóm ops để xem xét? – ericraio

0

Thử thiết lập webmin trong máy chủ của bạn. Nếu trang web được lưu trữ của bạn cung cấp nó. Truy cập URL được đề cập bên dưới. Thật dễ dàng để thiết lập và sử dụng một cách tự do.

URL là:

http://your_ip_address:10000/ 

Tôi đã sử dụng này trong nhiều ứng dụng của tôi nó đã làm việc cho tôi để sắp xếp công việc cron.

Các vấn đề liên quan