Gần đây tôi đã bắt đầu thử nghiệm bằng cách sử dụng Python để phát triển web. Cho đến nay tôi đã có một số thành công bằng cách sử dụng Apache với mod_wsgi và khung web Django cho Python 2.7. Tuy nhiên tôi đã gặp phải một số vấn đề với các quy trình liên tục chạy, cập nhật thông tin và như vậy.Làm cách nào để chạy các quy trình Python dài hạn (vô hạn)?
Tôi đã viết một tập lệnh mà tôi gọi là "daemonManager.py" có thể bắt đầu và ngừng tất cả hoặc các vòng cập nhật python riêng lẻ (Tôi có nên gọi chúng là Daemons không?). Nó làm điều đó bằng cách forking, sau đó tải các mô-đun cho các chức năng cụ thể nó nên chạy và bắt đầu một vòng lặp vô hạn. Nó lưu một tập tin PID trong /var/run
để theo dõi quá trình. Càng xa càng tốt. Các vấn đề tôi gặp phải là:
Bây giờ, sau đó một trong các quy trình sẽ thoát. Tôi kiểm tra
ps
vào buổi sáng và quá trình này đã biến mất. Không có lỗi nào được ghi lại (Tôi đang sử dụng mô-đunlogging
) và tôi bao gồm mọi ngoại lệ mà tôi có thể nghĩ đến và ghi lại chúng. Ngoài ra tôi không nghĩ rằng các quy trình bỏ này có liên quan đến mã của tôi, bởi vì tất cả các quy trình của tôi chạy mã hoàn toàn khác nhau và thoát ra ở các khoảng thời gian tương tự. Tôi có thể sai, tất nhiên. Nó có bình thường đối với các quy trình Python chỉ chết sau khi chúng chạy trong ngày/tuần không? Tôi nên giải quyết vấn đề này như thế nào? Tôi có nên viết một daemon khác định kỳ kiểm tra xem các daemon khác vẫn đang chạy không? Nếu daemon đó dừng lại thì sao? Tôi đang thua lỗ về cách xử lý việc này.Làm cách nào tôi có thể biết lập trình nếu quá trình vẫn đang chạy hay không? Tôi đang lưu các tập tin PID trong
/var/run
và kiểm tra xem tệp PID có ở đó để xác định liệu quá trình có đang chạy hay không. Nhưng nếu quá trình này chỉ chết vì các nguyên nhân không mong muốn, tệp PID sẽ vẫn còn. Do đó, tôi phải xóa những tập tin này mỗi khi một quá trình bị treo (một vài lần mỗi tuần), mà loại thất bại mục đích. Tôi đoán tôi có thể kiểm tra nếu một quá trình đang chạy tại PID trong tập tin, nhưng nếu một quá trình khác đã bắt đầu và được chỉ định PID của quá trình chết? Daemon của tôi sẽ nghĩ rằng quá trình này đang chạy tốt ngay cả khi nó chết lâu. Một lần nữa tôi thua lỗ chỉ cách giải quyết vấn đề này.
Bất kỳ câu trả lời hữu ích về cách quá trình Python vô hạn chạy tốt nhất, hy vọng cũng hé lộ ánh sáng về những vấn đề trên, tôi sẽ chấp nhận
Tôi đang sử dụng Apache 2.2.14 trên một máy Ubuntu.
Phiên bản Python của tôi là 2.7.2
Nếu bạn thêm một số mẫu mã hiển thị mã cho các daemon đang gặp sự cố, chúng tôi có thể giải quyết các chi tiết cụ thể. Mặc dù vậy, trước hết, tôi sẽ xóa tất cả mã khỏi các tập lệnh của bạn xử lý việc tìm kiếm, giám sát, chuyển hướng, v.v. –
Bạn có thể làm rõ liệu bạn đang sử dụng các quy trình daemon này từ ứng dụng WSGI đang chạy dưới mod_wsgi hay riêng rẽ. Bạn không nên làm việc tạo quy trình như vậy từ một ứng dụng đang chạy dưới mod_wsgi. –
Âm thanh như rất nhiều công khai đang diễn ra ở đây. Ý tôi là, đây là một câu hỏi được đặt đúng, trên đó một câu trả lời được đưa ra cho một công nghệ cụ thể, mà một câu trả lời khác được đưa ra trong đó nó được trả lời một lần nữa "Tôi cũng đã kết thúc bằng cách sử dụng" một công nghệ khác (cạnh tranh?) ... – citn