2011-08-11 22 views
5

Tôi vừa hoàn thành ứng dụng của mình và muốn triển khai ứng dụng. Nhưng làm thế nào để chạy ứng dụng của tôi như một dịch vụ/deamon?Chạy webapp2 bên ngoài appengine, cách chạy nó như một dịch vụ/deamon?

Tìm kiếm trên google đã hiển thị một số sự chấp thuận khác nhau bằng cách sử dụng một số thư viện python, được xoắn và Can I run a Python script as a service?. Nhưng không thể tìm ra cách để làm điều đó.

Mọi người đã làm điều này? Có cách tiếp cận thực hành tốt nhất?

..fredrik

+0

Tại sao bạn muốn chạy nó dưới dạng daemon? – moraes

+0

Chạy với 'python main.py &' có vẻ hơi không an toàn. Nếu nó không thành công/bị treo, tôi sẽ tự động khởi động lại cũng như ghi deamon vào một tệp nhật ký. – fredrik

+0

@fredrik i đã thêm chi tiết về xử lý sự cố và đăng nhập vào câu trả lời của tôi – MatToufoutu

Trả lời

4

Như bạn muốn ứng dụng của bạn để chạy độc lập (nếu tôi hiểu một cách chính xác), bạn có thể xử lý này giống như với bất kỳ (không web) khác ứng dụng.

Nếu bạn chỉ muốn chương trình chạy dưới nền, bạn có thể đọc this receipe giải thích cách tạo ứng dụng daemon và thảo luận tốt đẹp về chủ đề này (trong nhận xét).

Mặt khác, nếu bạn muốn tạo một "daemon hệ thống" với ứng dụng của bạn (khởi động khi khởi động mọi hệ thống), tôi sẽ sử dụng tập lệnh shell. Để xem cách tạo các tập lệnh khởi động cho hệ thống của mình, bạn có thể lấy cảm hứng từ các tập lệnh khởi động khác trên máy của mình. Một giải pháp sẽ chạy chương trình của bạn ở chế độ nền với python my_app.py & (từ tập lệnh khởi động) và sau đó sử dụng biến số $! để nhận được quy trình 'pid và lưu nó vào một tệp, theo cách này bạn cũng có thể dừng quá trình của mình bằng cách đọc "tệp pid" và sử dụng lệnh kill (gửi SIGINT vào quá trình của bạn sẽ kích hoạt một ngoại lệ KeyboardInterrupt để được nêu trong đơn của bạn).

EDIT:

Trong bình luận câu hỏi của bạn, bạn nói sử dụng python main.py & sẽ không an toàn như các ứng dụng sẽ không khởi động lại nếu nó thất bại/rơi, nhưng đó là tương tự với bất kỳ daemon khác trên hệ thống của bạn (ví Ví dụ, nếu Apache bị lỗi, nó sẽ không tự khởi động lại). Nếu bạn muốn khởi động lại ứng dụng của mình nếu nó gặp sự cố, bạn sẽ phải viết một daemon thứ 2, sẽ kiểm tra các khoảng thời gian đều đặn nếu ứng dụng của bạn vẫn đang chạy và khởi động lại nếu cần.

Về điều ghi nhật ký, bạn có thể làm cho đầu ra ứng dụng của mình thành stdout/stderr và chuyển hướng nó từ tập lệnh khởi động (python main.py &> /path/to/app.log &) hoặc xử lý ghi nhật ký từ ứng dụng của bạn, sử dụng mô-đun logging.

+0

Cảm ơn. Về việc đăng nhập: Khi tôi chạy 'python main.py' nó sẽ hiển thị" phục vụ trên http://127.0.0.1:8080 ". Nhưng khi tôi chạy 'sudo python main.py &> /var/log/apns.log &' không có gì được thêm vào trong tệp nhật ký. Cũng đã thử 'logging.info ('started')' trong main.py. Không có gì xảy ra với tệp nhật ký (nhưng máy chủ khởi động okey). Bất kỳ ý tưởng? – fredrik

+0

@fredrik có thể ứng dụng của bạn không có quyền ghi vào/var/log – MatToufoutu

+0

@agf: '&>' đã chuyển hướng cả stdout và stderr – MatToufoutu

2

Ngoài ra, bạn có thể dễ dàng chạy và kiểm soát quá trình deamonized với người giám sát và đăng nhập đầu ra stdout/stderr của nó quá.

+0

http://packages.ubuntu.com/supervisor | http://packages.gentoo.org/package/app-admin/supervisor | http://aur.archlinux.org/packages.php?K=supervisor | http://rpm.pbone.net/index.php3?stat=3&search=supervisor * (định dạng đã chỉnh sửa) * – iki

1

demonizing một kịch bản python là thực sự demonizing python.

Nếu bạn là người chủ, hãy xem xét sử dụng màn hình GNU để thực hiện công việc đó. Màn hình chính nó sẽ xử lý các điều khiển thiết bị đầu cuối mà thường là nhiệm vụ phức tạp nhất liên quan đến xây dựng một quá trình daemon.

Bắt đầu màn hình, chạy chương trình, tách, sau đó đăng xuất nếu bạn muốn, và nó sẽ để lại một quy trình giống như daemon phía sau. Cách tiếp cận này có hiệu quả đặc biệt là khi chương trình của bạn đang được xây dựng, không phải là rất ổn định, hoặc bán phá giá nhiều tin nhắn được viết nhanh để gỡ lỗi.

Vẫn còn một số điều cần lưu ý khi sao chép chương trình, như thay đổi thư mục làm việc thành/và đóng bộ mô tả không sử dụng trong trường hợp bạn phải ngắt kết nối hệ thống tập tin, hoặc lập trình lại xử lý tín hiệu, ... vv , hầu hết các điều kiện đều thỏa mãn nếu bạn thực hiện một quy trình từ init hoặc phiên đăng nhập sạch; chỉ cần nhớ thay đổi thư mục thành "/", thường là đủ.

Nhưng việc sử dụng màn hình không giúp tồn tại một sự cố, sự cố luôn là những gì các lập trình viên phải giải quyết.

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