2013-07-19 37 views
34

Tôi đã viết một mô-đun bằng Python và muốn nó chạy liên tục sau khi bắt đầu và cần dừng nó khi tôi cần cập nhật các mô-đun khác. Tôi có thể sẽ sử dụng monit để khởi động lại nó, nếu module bị hỏng hoặc không hoạt động.Daemon vs Upstart cho tập lệnh python

Tôi đã trải qua các kỹ thuật khác nhau như Daemon, Upstart và nhiều công cụ khác.

Cách nào tốt nhất để tôi sử dụng phương pháp đó thông qua tất cả các mô-đun mới để tiếp tục chạy chúng mãi mãi?

Trả lời

67

Từ khi bạn đề cập đến Upstart, tôi sẽ giả định rằng câu hỏi này là dành cho một dịch vụ đang chạy trên máy chủ Ubuntu. Trên máy chủ Ubuntu, một công việc mới nổi thực sự là lựa chọn đơn giản và thuận tiện nhất để tạo một dịch vụ luôn khởi động vào đúng thời điểm và có thể được dừng lại hoặc tải lại với các lệnh quen thuộc.

Để tạo dịch vụ mới nổi, bạn cần thêm một tệp vào /etc/init. Được gọi là <service-name>.conf. Một tập lệnh mẫu trông giống như sau:

description "My chat server" 
author "[email protected]" 

start on runlevel [2345] 
stop on runlevel [!2345] 

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set 

respawn 

exec /srv/applications/chat.py 

Điều này có nghĩa là mọi lúc máy bắt đầu chương trình sẽ bắt đầu chương trình chat.py. Nếu nó chết vì bất cứ lý do gì nó sẽ khởi động lại nó. Bạn không cần phải lo lắng về việc sử dụng gấp đôi hoặc ngược lại mã daemon của bạn. Đó là xử lý cho bạn bởi mới nổi.

Nếu bạn muốn dừng hoặc bắt đầu quá trình của bạn, bạn có thể làm như vậy với

service chat start 
service chat stop 

Tên chat được tự động tìm thấy từ tên của tập tin .conf bên /etc/init

Tôi chỉ bao gồm các khái niệm cơ bản về khởi đầu ở đây. Có rất nhiều tính năng khác để làm cho nó hữu ích hơn nữa. Tất cả có sẵn bằng cách chạy man upstart.

Phương pháp này thuận tiện hơn nhiều so với viết mã daemonization của riêng bạn. Một tập tin cấu hình 4-8 dòng cho một thành phần được xây dựng trong Ubuntu là ít hơn nhiều lỗi dễ làm hơn làm cho mã của bạn một cách an toàn gấp đôi ngã ba và sau đó có một quá trình giám sát nó để đảm bảo nó không biến mất.

Monit là một chút cá trích đỏ. Nếu bạn muốn cảnh báo thời gian ngừng hoạt động, bạn sẽ cần chạy chương trình theo dõi trên máy chủ riêng biệt. Dựa vào mới nổi để giữ cho quá trình luôn chạy trên máy chủ. Sau đó, có một dịch vụ khác nhau đảm bảo máy chủ thực sự đang chạy. Thời gian ngừng hoạt động xảy ra vì nhiều lý do khác nhau. Một quá trình chạy trên cùng một máy chủ sẽ cho bạn biết chính xác không có gì nếu chính máy chủ bị hỏng. Bạn cần một máy riêng biệt (hoặc một nhà cung cấp bên thứ ba như pingdom) để cảnh báo bạn về điều kiện đó.

+0

Có nguồn xác thực nào hỗ trợ câu trả lời của bạn không? Chạy trên Ubuntu là một tùy chọn nhưng không bắt buộc (daemonize sẽ hoạt động trên cả hai). Thứ hai, bạn phải sử dụng monit ngay cả khi mới nổi để nhận cảnh báo thời gian chết. – mtariq

+0

Bạn có thể bắt đầu gửi email cho bạn khi nó dừng/bắt đầu (http://serverfault.com/questions/236925/how-can-i-receive-an-email-when-an-upstart-monitored-script-respawns) . nguồn xác thực? Mọi người sử dụng mới nổi trong sản xuất ở khắp mọi nơi. Chúng tôi sử dụng mới nổi trong sản xuất Bạn không thể sử dụng monit cho cảnh báo thời gian chết. Nó là vô nghĩa. Xem câu trả lời đã chỉnh sửa vì lý do tại sao. – aychedee

+0

Bài đăng tuyệt vời. Upstart là trong cây Debian, vì vậy nó có thể có thể được sử dụng trong vanilla debian hoặc Mint cũng như các dẫn xuất khác. – meawoppl

3

tôi đã sử dụng kiểu cũ init script với start-stop-daemon utility.Look tại skel trong /etc/init.d

5

Bạn có thể kiểm tra supervisor. Những gì nó có khả năng là bắt đầu một quá trình khởi động hệ thống, và sau đó giữ nó sống cho đến khi tắt máy.

Các tập tin cấu hình đơn giản nhất sẽ là:

[program:my_script] 
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py 
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR 
autostart = True 
autorestart = True 

Sau đó, bạn có thể liên kết nó với /etc/supervisord/conf.d, chạy sudo supervisorctl nhập giao diện điều khiển quản lý giám sát, gõ reread để giám sát rằng thông báo nhập cấu hình mới và update để hiển thị mới các chương trình trên danh sách status.

Để bắt đầu/khởi động lại/dừng chương trình bạn có thể thực thi sudo supervisorctl start/restart/stop my_script.

+0

Một lưu ý chung cho người đọc rằng người giám sát không hoạt động với Python 3. – shongololo

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