Làm thế nào tôi có thể tự động khởi động lại một quá trình sau khi nó kết thúc?


11

Tôi đã có một chương trình golang mà tôi muốn khởi động lại sau khi chương trình này kết thúc trên hộp Debian Squeeze. Điều này đang phục vụ HTTP đằng sau thiết lập mod_proxy của Apache 2. Tôi không hy vọng quá trình này thất bại, nhưng tôi muốn có một số bảo hiểm chống lại nó.

Trên Ubuntu tôi đã sử dụng mới bắt đầu để giữ cho quá trình sống. Debian không thích Upstart từ những gì tôi hiểu vì nó là một sự thay thế init.

Có một sự thay thế nào khởi động lại một hoặc nhiều quá trình sau khi chúng chấm dứt hoạt động trên Squeeze và chơi tốt với init không?


Bạn vui lòng viết lại câu hỏi của bạn? Có phải là bạn muốn khởi động lại một quá trình sau khi nó đã bị chấm dứt?
mailq

Tôi muốn tự động khởi động lại một quy trình nếu nó bị lỗi hoặc tự chấm dứt.
Đã xóa

2
Chương trình init truyền thống thực hiện chính xác điều này. Tại sao mọi người nghĩ rằng nên sử dụng init để chạy tập lệnh shell gọi tập lệnh shell bắt đầu một quá trình khác làm điều tương tự, nhưng không có kernel tự động hoảng loạn và khởi động lại nên quá trình đó sẽ thất bại, hoàn toàn nằm ngoài tôi.
Simon Richter

Đó là một điểm công bằng. Tôi cũng sẽ điều tra bằng cách sử dụng init. Tôi đang đóng gói phần mềm bằng dpkg vì vậy việc tạo các tập lệnh init không phải là một khó khăn.
Đã xóa

Câu trả lời:


10

Cách tốt nhất để đi cho nó là daemontools. Chúng cho phép bạn theo dõi và hồi sinh quá trình.

Xem tài liệu trên trang web của họ: http://cr.yp.to/daemontools.html


1
Cảm ơn - đó chỉ là những gì tôi đang theo đuổi. DJB = tốt như một quy luật. Tôi thực sự nên nhớ rằng đã tồn tại những gì với việc dành 5 năm để chăm sóc qmail!
Đã xóa

Tương tự với tôi, ngoại trừ việc tôi thường chăm sóc djbdns khá lâu.
mr.b

10

giám sát là một thay thế nhẹ, hiệu quả. Theo debian, nó được đóng gói trong daemontools . Bạn cũng có thể đọc câu hỏi có liên quan , trong đó liệt kê một số giám sát những lời chỉ trích, và đề cập đến restartd như một khả năng khác.

Cuối cùng, nếu bạn muốn một cái gì đó cực kỳ dễ cài đặt, tôi đã thành công lớn với monit . Nó cũng được đóng gói trong Debian .


2
daemontools là tuyệt vời; monit là một cơn ác mộng kỳ quái của "tại sao bạn sẽ không bắt đầu?!?" thất vọng.
womble

2

giám sát hoặc monit là tốt để giữ cho một quá trình duy nhất còn sống. Vì bạn yêu cầu duy trì các quy trình "một hoặc nhiều" còn sống, tôi muốn cắm giám sát . Nó chắc chắn là quá mức cần thiết để quản lý một quy trình duy nhất, nhưng nếu bạn cần theo dõi nhiều quy trình thì đó có thể là việc của bạn.


2

Một lựa chọn là sử dụng /etc/inittabthay vì đưa tập lệnh của bạn vào /etc/init.d/.

Bạn chỉ cần thêm một mục theo định dạng sau:

<jobname>:<runlevels>:respawn:<command>

Thật không may, điều này có nghĩa là bạn không thể sử dụng các lệnh init / stop / restart init bình thường, nhưng nó sẽ đảm bảo tập lệnh của bạn luôn chạy.


2

Cách phân phối chéo của quá trình xử lý lại bắt đầu là với cron và một tập lệnh đơn giản. Bạn có thể xem một bài viết ở đây Cách giữ một công việc đang chạy trong Linux

Kịch bản trông giống như

#!/bin/bash 
# make-run.sh 
# make sure a process is always running.  
# Add the following to the crontab (i.e. crontab -e)
# */5 * * * * /home/path_to_make_run/make-run.sh

process=servermonitoringhq 
makerun="/home/path_to_the_job_you_want_running/runjob.sh"  

if pgrep $process > /dev/null         
then                 
  exit         
else         
  $makerun &         
fi 
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.