Làm cách nào để chạy tập lệnh Python trong nền và khởi động lại sau khi gặp sự cố?


10

Tôi có một tập lệnh Python rất đơn giản mà tôi muốn luôn chạy trên máy chủ Ubuntu 12.04 của mình. Tôi nghĩ về việc sử dụng upstart + monit. Vấn đề là những công cụ đó có vẻ khá phức tạp đối với một người phàm tục như tôi và tôi không thể tìm thấy một ví dụ đơn giản trên web.

Là upstart + monit quá mức cần thiết? Có ai biết một sự thay thế đơn giản hơn, hoặc một hướng dẫn tốt cho upstart + monit? Nếu tôi chỉ muốn chắc chắn rằng kịch bản luôn luôn chạy, liệu có cần thiết không?


Để tham khảo, chính xác câu hỏi tương tự đã được hỏi ở đây: superuser.com/q/461546/786969
PHPirate

Câu trả lời:


16

Cách đơn giản nhất để làm điều này là đặt cái này vào /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Sự hồi sinh sẽ khởi động nó trở lại nếu nó bị giết hoặc thoát ra khác không (giống như một ngoại lệ chưa được bắt). Điều này sẽ hoạt động trở lại Ubuntu 10.04.

Nếu bạn có 12.04 bạn có thể nhận được nhiều ưa thích hơn. Ở trên sẽ chạy tập lệnh của bạn là root. Trong 12.04, bạn có thể thêm setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Nếu tập lệnh của bạn thoát khi không có mạng và bạn dự định chạy nó trên kết nối mạng không ổn định, tốt, bạn nên sửa nó và chỉ làm cho nó tồn tại / thử lại. Nhưng nếu bạn không thể, bạn cũng có thể cần phải khởi động thủ công bất cứ khi nào thiết bị mạng xuất hiện. Vì vậy, bạn có thể đặt cái này vào /etc/network/if-up.d/yourscript(làm cho nó thực thi được với chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Trường hợp của bạn chỉ là một cái gì đó tùy ý và duy nhất cho tập lệnh cụ thể này và "cái gì đó" giống như tên công việc (chẳng hạn như /etc/init/something.confđề xuất trước đó).


Vâng! Vậy đây là sử dụng upstartphải không? Điều này có nghĩa là kịch bản cũng sẽ được khởi động khi khởi động (sẽ rất tuyệt!)? Và respawncó đủ để bạn không cần phải thiết lập monit?
sebpiq

Có, 'start on runlevel [2345]' có nghĩa là tại thời điểm hệ thống chuyển sang "chế độ đa người dùng". Về lâu dài, có một kế hoạch được hình thành để thay thế "runlevel" rất cũ bằng những thứ như 'bắt đầu bắt đầu dịch vụ mạng' và 'dừng việc dừng dịch vụ mạng' để nó đọc hợp lý hơn.
SpamapS

Tuyệt vời ! Cảm ơn rất nhiều đó chính xác là những gì tôi cần.
sebpiq

2

Cách tiếp cận thông thường từ ngày xưa là viết một tệp chứa dấu thời gian hoặc id tiến trình /tmpvà sau đó kiểm tra xem id quá trình này có còn chạy hay không, nếu dấu thời gian vẫn còn gần đây.

Ngoài ra, bạn có thể làm một while [ 1 ]; do phyton-script.ph; donewich đơn giản sẽ khởi động lại tập lệnh trong trường hợp nó trả về.

Để biết thêm khả năng xin vui lòng cung cấp thêm thông tin về kịch bản của bạn. Đặc biệt là lý do tại sao bạn mong đợi nó thoát hoặc sụp đổ bất ngờ.


tập lệnh chỉ loại bỏ các tweet từ twitters bằng API streaming. Vì vậy, về cơ bản, có một vòng lặp vô hạn đang chờ các tweet được đẩy, thực thi một số mã và quay lại chờ. Tôi chỉ muốn nó chạy mà không phải lo lắng ... nếu có lỗi và nó gặp sự cố, v.v ...
sebpiq

Một câu trả lời tương tự với câu trả lời của bạn (mà tôi đã chấp nhận): superuser.com/questions/461546/ cấp
sebpiq

Ngoài ra một công việc định kỳ để kiểm tra xem tập lệnh có còn chạy hay không có thể là một ý tưởng hay.
con-f-sử dụng
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.