Làm thế nào để khởi chạy lại một thực thi nếu nó chết


8

Tôi đang tìm cách theo dõi một quy trình và khởi chạy lại chương trình thực thi nếu quy trình đó chết vì bất kỳ lý do gì. Linux có một công cụ tích hợp có thể làm điều này không?


Có thêm một số câu trả lời và gợi ý trong câu hỏi này serverfault.com/questions/56526/ cấp
jrg

Câu trả lời:


7

Nếu nó được khởi chạy từ init, bạn có thể thấy nó được khởi động lại bởi init. Đặt hành động cho quy trình thành 'hồi sinh' cho các cấp độ chạy mà bạn muốn quy trình tại.


Tương tự, launchd là khá tốt đẹp.
Jeremy L

Đúng vậy Các công cụ Daemon cũng khá tuyệt cho loại công cụ này, nhưng không thành công trong thử nghiệm 'tích hợp sẵn'.
Cian

10

Tôi đã trả lời một câu hỏi tương tự trước đây .

Trong trường hợp của bạn:

#!/bin/bash
while ! <<command>>
do
  sleep 1
  echo "Restarting program..."
done

Thay thế <<command>>bằng lệnh bạn muốn thực thi. Quá trình phải kết thúc với mã thoát 0 để phá vỡ vòng lặp. Nếu không, nó được khởi động lại bởi tập lệnh.


Đẹp. Điều này cũng hoạt động với ksh và tôi sẽ thay đổi "echo" thành lệnh "logger" để đưa thông điệp vào nhật ký hệ thống.
Mei

Câu trả lời hoàn hảo bro. Giữ nó lên.
Arunjith RS

4

Bạn chỉ muốn khởi động lại nó nếu nó chết? Vấn đề với điều này là nó không xử lý các tình huống đóng băng. Vì vậy, để kiểm tra quá trình sẽ không luôn luôn giúp đỡ. Vì vậy, nếu đây là một cái gì đó giống như một máy chủ web, bạn muốn có một kịch bản kiểm tra nó từ quan điểm của người dùng.

Nếu bạn thiết lập Giám sát Nagios, thì bạn có thể sử dụng trình xử lý sự kiện . Đây chỉ là các tập lệnh mà bạn viết sẽ chạy khi dịch vụ ngừng hoạt động, vì vậy bạn có thể có một tập lệnh khởi động lại một cái gì đó giống như Apache nếu trang web bị hỏng.


+1, Hãy chắc chắn rằng bạn cũng bao gồm các tình huống bị giết có chủ ý .
Maximus Minimus

Điểm hay, mặc dù trong trường hợp của tôi, quá trình này đã biến mất
cá nóc

3

Tùy thuộc vào bản phân phối, nhưng chúng tôi đã sử dụng thành công "monit" cho nhiệm vụ này. Nó khá dễ. Bạn có thể viết séc của riêng bạn, theo dõi quy trình PID, v.v.

Ví dụ tệp monitrc:

check process sshd with pidfile /var/run/sshd.pid
   start program  "/etc/init.d/ssh start"
   stop program  "/etc/init.d/ssh stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

2

Tại sao không phải là một kịch bản bash đơn giản?

#!/usr/bin/bash
while `true`
do
  xeyes
done

Thay thế xeyes với chương trình bạn chọn.


0

Trả lời ngắn gọn : Không bạn phải tự làm điều đó.

Câu trả lời dài : Bạn sẽ cần một quy trình cha mẹ để bắt đầu nó, và sau đó tiếp tục kiểm tra xem nó còn tồn tại không và khởi động lại nếu cần.

Bạn có thể sử dụng một cái gì đó như daemontoolsđể quản lý nó.


Câu trả lời ngắn gọn: bạn đã chết sai. Câu trả lời dài: nếu một bản phân phối Linux không có inittab, nó sẽ có /etc/event.d/ - một trong hai cơ chế sẽ khởi động lại một quy trình khi nó chết.
Paul Tomblin
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.