Thực thi mã mỗi giờ [đóng]


8

Tôi cần tạo một dịch vụ web thực thi mỗi giờ. Nó sẽ được sử dụng để xem xét dữ liệu trong cơ sở dữ liệu và thêm cảnh báo vào bảng trong cùng cơ sở dữ liệu nếu điều kiện nhất định được đáp ứng / không được đáp ứng. Những gì chúng tôi hiện đang có là:

Chúng tôi có các thiết bị đầu cuối sử dụng Python để báo cáo cho máy chủ ảo Dịch vụ web Amazon (AWS). Máy chủ AWS lấy thông tin đó và lưu trữ nó trong cơ sở dữ liệu MySQL. Máy chủ AWS là Linux chạy Django và Apache. Tôi cần để có thể có một số mã python chạy mỗi giờ để xác minh dữ liệu đã được lưu trữ bởi các thiết bị cuối. Nếu một số điều kiện không được đáp ứng thì một bản ghi sẽ được thêm vào alertsbảng trong cơ sở dữ liệu.

Chúng tôi ban đầu ký hợp đồng để có các thiết lập ở trên được tạo ra. Tôi chưa quen với Python, Django và Apache. Tuy nhiên, tôi đã thực hiện một số thay đổi đối với mã Python gửi và cũng nhận dữ liệu từ các thiết bị cuối. Tôi là một lập trình viên đang đột nhập vào lập trình web.

Có ai có bất kỳ khuyến nghị về cách tôi có thể làm điều này?


Sử dụng Quartz-Lập lịch. Theo dõi Liên kết sẽ rất hữu ích. thạch anh-scheduler.org Hướng dẫn thạch anh-scheduler.org / documentation /quartz-2.1.x / quick

Quartz có vẻ được thiết kế cho Java. Tôi hoàn toàn không sử dụng Java. Tôi đang sử dụng Python / Django.
Nán lại

Câu trả lời:


31

Làm thế nào về việc thực hiện một cronjob , giả sử bạn có quyền truy cập shell?

Trình nền cron tồn tại trên hầu như bất kỳ hệ thống nào giống như UNIX và lên lịch các lệnh để chạy dựa trên một mô tả trong một tệp gọi là crontab .

Mỗi dòng của tệp chứa một tập các trường để chỉ ra các mốc thời gian khi một lệnh sẽ được thực thi.

Nhiệm vụ của bạn có thể là một chương trình độc lập thực hiện nhiệm vụ mà bạn muốn thực hiện hoặc như một câu trả lời khác gợi ý, một lời mời của máy khách HTTP như wget , curl hoặc tìm nạp để truy cập tài nguyên web sẽ thực hiện hành động.

Nếu bạn có giới hạn về thời gian yêu cầu có thể phục vụ, bạn có thể phải chuyển tác vụ sang tập lệnh ngoại tuyến hoặc chương trình không chạy bên trong khung / máy chủ web của bạn.


Cron chắc chắn là những gì tôi đã sử dụng. Cảm ơn câu trả lời. Đối với những người không muốn làm việc với Cron nhưng muốn có cùng chức năng, tôi đã tìm thấy hai dịch vụ trực tuyến thực hiện các công việc như Cron: SetCronJobCronless .
Nán lại

17

Với Django trên AWS, tôi sẽ tìm hiểu về Celery .

Celery thêm các tác vụ không đồng bộ và bao gồm một trình lập lịch biểu, và trên AWS, bạn có thể định cấu hình Celery để sử dụng Dịch vụ xếp hàng đơn giản của Amazon làm nhà môi giới (xem Celery với Amazon SQS trên Stack Overflow và bài đăng trên blog này về chủ đề này).

Bạn thiết lập lịch trình tác vụ định kỳ Celery và nó sẽ chạy một tác vụ được định cấu hình theo lịch biểu đó.

Ưu điểm là bạn có thể sử dụng toàn bộ thiết lập để chạy bất kỳ tác vụ không đồng bộ nào, giảm tải các tác vụ nặng từ máy chủ web của bạn cho nhân viên Celery.

Sự thay thế trọng lượng nhẹ là chỉ thiết lập một công việc crontab; bạn thậm chí có thể định cấu hình tuyến đường trong ứng dụng Django của mình để được gọi bằng curlhoặc wget:

* 5 * * * curl http://username:password@hostname/route_to_job

1
+1 Một giải pháp tinh tế hơn nhiều so với cronnhiệm vụ đơn giản của tôi và cụ thể đối với việc triển khai của OP.
msanford

7

Vì phiên bản AWS của bạn chạy Linux, bạn có thể hoàn thành công việc này như một croncông việc .

Bạn có thể lấy những gì tôi sẽ gọi là phương pháp tiếp cận cron của Drupal , trong trường hợp Django, liên quan đến việc tạo bộ điều khiển để phản hồi URL và sau đó thực hiện hành động bạn muốn.

Sau đó, bạn định cấu hình tác vụ cron cho curlURL của bộ điều khiển, kích hoạt tập lệnh của bạn.

Điều này có thêm lợi thế là có thể dễ dàng gọi bất cứ lúc nào từ một URL: có thể người quản lý thiếu kiên nhẫn muốn báo cáo được tạo từ dữ liệu từ 20 phút trước.


3

Bạn có thể muốn xem xét APScheduler. Đây là một trình lập lịch giống như thạch anh (mặc dù không rộng rãi) cho Python.

Đây có thể là một sự thay thế tốt hơn nhiều cho các tập lệnh cron chạy bên ngoài cho các ứng dụng chạy dài (ví dụ: ứng dụng web), vì nó là nền tảng trung lập và có thể truy cập trực tiếp vào các biến và chức năng của ứng dụng của bạn.

Bạn có thể tìm thấy một mô tả cho bản phát hành gần đây nhất tại đây: http://pypi.python.org/pypi/APScheduler/2.0.3

Có một số tài liệu để cài đặt / thực hiện tại đây: https://apscheduler.readthedocs.org/en/latest/

Dưới đây là một số tính năng:

  • Không (cứng) phụ thuộc bên ngoài
  • API an toàn cho chủ đề
  • Phạm vi kiểm tra xuất sắc (được thử nghiệm trên CPython 2.5 - 2.7, 3.3, Jython 2.5.3, PyPy 1.9)
  • Cơ chế lập lịch trình cấu hình (kích hoạt):
    • Lập kế hoạch giống như cron
    • Lịch trình bị trì hoãn của các công việc chạy đơn lẻ (như lệnh UNIX UNIX tại Lệnh)
    • Dựa trên khoảng thời gian (chạy một công việc tại các khoảng thời gian xác định)
  • Nhiều cửa hàng công việc đang hoạt động đồng thời:
    • RAM
    • Cơ sở dữ liệu đơn giản dựa trên tệp (kệ)
    • SQLAlchemy (mọi RDBMS được hỗ trợ hoạt động)
    • MongoDB
    • Redis

1

Tôi nghĩ rằng, bạn có thể sử dụng một số thứ như django-extensions

Trang web mở rộng Django

Có một mô-đun - công việc. Đối với tôi đây là một công cụ rất tốt để kiểm soát cronjobs của bạn.

Tùy chọn thứ hai là sử dụng Fabric và tạo chức năng cho việc này.

Và tôi thấy cách thứ ba. Sử dụng trí tưởng tượng và kiến ​​thức của bạn và tạo chức năng riêng với quy trình con và sh.


1

Câu trả lời rất có thể ở đây được cung cấp là bạn đang chạy crontab với cài đặt mặc định, điều đó có nghĩa là nó đang hiển thị crontab SPUC RATHER THAN THE PHIM.

Trong khi đó, nó cũng có thể được chạy trong AWS vì nó được cài đặt và cấu hình sẵn cron, cho phép thiết lập một tác vụ nên được chạy hàng giờ, hàng ngày, hàng tuần hoặc hàng tháng cũng như bất kỳ khoảng thời gian nào khác bằng cách đặt các tệp vào một /etc/cron.xxxxxxthư mục như được giải thích ở đây .

Thiết lập một công việc để chạy hàng giờ, hàng ngày, hàng tuần hoặc hàng tháng là rất nhanh chóng. Vì câu hỏi là hỏi cách thực thi mã mỗi giờ, vì vậy trong AWS Linux, bạn có thể tạo một tệp /etc/cron.hourly.

Đây là bước khi bạn đăng nhập vào cá thể của mình thông qua ứng dụng khách SSH.

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ sudo mv application /etc/cron.hourly/
$ sudo chown -R root /etc/cron.hourly
$ sudo chmod 2755 /etc/cron.hourly/application
$ sudo /etc/init.d/crond restart

Trong ví dụ trên, tệp được lưu và được đặt tên là 'ứng dụng'. Tên không thực sự quan trọng miễn là nó là duy nhất. Đây là báo cáo nhật ký bằng cách chạy:$ sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

Như được hiển thị trong nhật ký, hàng giờ, nó sẽ bắt đầu chạy anacron thực hiện lập lịch lệnh định kỳ được thực hiện bởi cron , sau đó gọi mọi tệp khác trong thư mục và chạy các lệnh trong mỗi tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.