Cách giám sát một dịch vụ và khởi động lại nếu dừng trong Linux


24

Trên thực tế tôi không chắc chắn liệu tôi có nên sử dụng Shell Sc Script hay không, nếu đã có một số cách. Nhưng bất cứ cách tiếp cận nào chúng tôi sử dụng, tôi đều muốn Dịch vụ luôn hoạt động.

Hãy nói iptablesnhư một ví dụ. Sau đó ..

  • Bất cứ khi nào các iptablesdịch vụ là stoppedhay (nói cách khác) không chạy, tôi muốn nó được started(hoặc restarted) .. tự động bất cứ khi nào nó dừng lại (hoặc không chạy).
  • Nói cách khác, tôi muốn duy trì Dịch vụ luôn hoạt động.

(Có thể tôi có thể đưa ra tần suất hợp lý để kiểm tra, nếu thực hiện kiểm tra theo thời gian thực là vấn đề. Vì vậy, hãy nói, cứ sau 5 phút)

Cách duy nhất tôi có thể nghĩ đến, là sử dụng Shell Sc Script với Cron Tab.

  • Có giải pháp thông minh nào xin vui lòng?

Cảm ơn!


Bạn không nên làm điều đó. Giả sử một dịch vụ được cấu hình không tốt, chiến lược của bạn sẽ đạt được điều gì? Một danh sách vô hạn của những người về hưu. Thay vào đó, bạn nên viết một kịch bản crontab mà alertsbạn để một cái gì đó không hoạt động.
MariusMatutiae

Tôi chỉ tò mò về giải pháp thẳng, cho câu hỏi ban đầu. Ngoài ra, tôi có một Dịch vụ chỉ cần đơn giản là restartedbất cứ khi nào nó dừng, vì bất kỳ lý do gì. Không có vấn đề với việc khởi động lại.
夏 期

1
Giải pháp đề xuất của riêng bạn là đủ thông minh. Nếu bạn sử dụng đúng cách (thoát ngay lập tức nếu dịch vụ đang chạy, hãy thông báo cho bạn rằng dịch vụ đã dừng để bạn có thể khắc phục, v.v.) đó là cách đơn giản nhất. Một dịch vụ dừng tự động là một dịch vụ có vấn đề, vì vậy cuối cùng bạn nên sửa nó, nhưng nếu không, như một bản vá tạm thời, một tập lệnh cron hoặc một trình nền siêu đơn giản khác mà hầu hết thời gian sẽ làm tốt công việc. Có một số công cụ như mmonit.com/monit nhưng tôi nghĩ rằng cuối cùng tất cả chúng đều sử dụng một cách tiếp cận tương tự

@MariusMatutiae, tôi đồng ý với quan điểm của bạn nhưng điều này phụ thuộc vào bản chất của dịch vụ và hầu hết các nhà quản lý quy trình sẽ rút lui sau một số lần khởi động lại không thành công. Hoàn toàn hợp lý khi một quá trình kết thúc một cách tự nhiên và chúng tôi muốn tự động khởi động lại nó, ví dụ như một công nhân nhận công việc từ hàng đợi và kết thúc sau mỗi lần chạy. Đây cũng là một công cụ hữu ích cho các sysadins bị mã rò rỉ bộ nhớ bespoke - giới hạn vòng đời của một quy trình và tự động khởi động lại trước khi nó có thể thoát khỏi tầm tay ...
Alex Forbes

Câu trả lời:


25

Cập nhật tháng 3 năm 2018

Câu trả lời này bây giờ khá cũ và vì nó đã được viết nên systemd đã chiến thắng cuộc chiến pid1 trên Linux. Vì vậy, có lẽ bạn nên tạo một đơn vị systemd , nếu systemd được tích hợp vào bản phân phối của bạn (phần lớn trong số chúng).

Câu trả lời dưới đây được bảo tồn cho hậu thế.


Câu trả lời monit ở trên là hợp lệ, nhưng tôi nghĩ tôi đã đề cập đến một số lựa chọn thay thế:

Điều đáng ghi nhớ là hệ điều hành của bạn đã giải quyết được vấn đề quản lý quy trình. Theo truyền thống, Linux đã sử dụng sysvinit, về cơ bản là tập hợp các tập lệnh mà bạn thấy trong init.d. Tuy nhiên, nó khá ngu ngốc và không thể theo dõi các quy trình, các tập lệnh init.d rất phức tạp và nó được thay thế vì lý do chính đáng.

Các hệ điều hành hiện đại hơn đang bắt đầu thay thế sysvinit và các ứng dụng tiên phong là Upstart và Systemd. Debian đang nghiêng về systemd, Ubuntu đã phát triển và đã chuyển đổi khá nhiều sang Upstart và giống như Debian Redhat / CentOS / Fedora đang chuyển sang systemd. Do đó, nếu bạn sử dụng HĐH đã thay thế sysvinit, tôi khuyên bạn nên sử dụng những gì được tích hợp sẵn. Các tập lệnh dễ viết hơn nhiều so với tập lệnh init.

Tôi đã sử dụng runit và khá thích nó, nhưng dễ sử dụng nhất là người giám sát. Nó cũng được ghi chép lại rất tốt, hoạt động ở hầu hết mọi nơi và được đóng gói trong tất cả các bản phân phối chính.

Nhưng bất cứ điều gì bạn làm, xin vui lòng, xin vui lòng, không sử dụng tập lệnh shell. Có rất nhiều điều sai với cách tiếp cận đó!


Làm thế nào để làm điều đó với sysvinit?
Horseyguy

12

iptableslà một ví dụ tồi vì nó không thực sự là một dịch vụ hoặc trình nền đang chạy, mà là một phần của kernel. Bạn không thể thực sự "dừng lại" iptables, bạn chỉ có thể cung cấp cho nó một cấu hình và "dừng" nó liên quan đến việc cung cấp cho nó một cấu hình trống. Quả thực tôi đã gặp sự cố hệ thống Linux, nhưng thiết lập chuyển tiếp cổng sử dụng iptablesvẫn tiếp tục hoạt động.

Dù sao, một tiện ích được gọi monitsẽ làm những gì bạn muốn. Nếu bạn đang sử dụng Debian thì đó là một sự apt-get install monitthật. Đó là một chút liên quan để tìm hiểu về nhưng rất linh hoạt.


3

Chúng tôi đang sử dụng tập lệnh đơn giản này để đưa ra cảnh báo và khởi động dịch vụ nếu nó không chạy, Bạn cũng có thể thêm nhiều dịch vụ nữa ..

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

Quan điểm của MariusMatutiae là chính xác nhưng chúng tôi đã thực hiện một tập lệnh đơn giản để giám sát dịch vụ HTTPD và DNS trong máy chủ của tôi, nó chạy rất tốt. Khi dịch vụ ngừng hoạt động, tập lệnh sẽ khởi động lại dịch vụ và thông báo cho chúng tôi, Chúng tôi nhận được rất nhiều cảnh báo / thư liên quan đến dịch vụ, sau đó chúng tôi có thể điều tra về dịch vụ đó.
Ranjithkumar T


0

Tôi biết đã được vài năm kể từ khi câu hỏi được hỏi. nhưng với systemd (hầu hết có sẵn với centos và REHL), bạn có thể chạy lệnh bash này với cron để kiểm tra và khởi động lại nếu dịch vụ không hoạt động.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

lưu nó trong thư mục bin của bạn và đặt tên như màn hình. Cho phép tập tin thích hợp cho nó. sau đó chạy nó như thế nào

sudo monitor redis

nếu bạn muốn kiểm tra dịch vụ redis và khởi động lại / bắt đầu nếu cần.

cuối cùng thêm điều này vào công việc định kỳ của bạn.

hy vọng điều này sẽ giúp


0

Để thêm vào danh sách dài giám sát init / svc, vì thư mục con của S6 có một đứa trẻ mới trong khối, 66, xử lý việc quản lý dịch vụ s6 và đăng nhập một cách nhanh chóng, thân thiện với người dùng. Đây là liên kết đến tài liệu chính thức cho Obarun-Linux https://web.obarun.org/software

Đây là Câu hỏi thường gặp về cách sử dụng phần mềm 66 này và có ý nghĩa của s6 http://sysdfree.wordpress.com/266

Vì bản phát hành ổn định của nó chỉ có một lỗi được tìm thấy liên quan đến thay đổi kernel từ 4.20 -> 5.0, tất cả các vấn đề được báo cáo khác phải làm với những người học một cái gì đó mới. Nếu việc quản lý dịch vụ phải trở nên đơn giản hơn thế này thì có lẽ tốt hơn là chuyển sang ms-windows (Linus cấm). Để thấy trong cuộc sống thực, làm thế nào điều này có thể hoạt động, người ta chỉ cần tải xuống một Obarun live.iso và chơi với nó. Cài đặt dịch vụ và 66 tập lệnh của chúng cho phép chúng, giết chúng, xem nhật ký của chúng, dừng chúng và khởi động chúng (trong khi được bật), bó các dịch vụ thành một cây và có các cây dịch vụ bắt đầu và dừng tất cả lại với nhau, có các dịch vụ cấp người dùng riêng biệt từ hệ thống. Nó làm những gì s6 làm tốt và giúp người dùng khai thác hệ thống chống đạn theo s6 đơn giản hơn.

Tải xuống hình ảnh có thể được tìm thấy ở đây: https://web.obarun.org/index.php?id=74 md5 kiểm tra tệp https://repo.obarun.org/iso/

Ngoài init và quản lý dịch vụ, s6 / 66 không có bất kỳ sự phụ thuộc nào từ bất kỳ thứ gì khác trên hệ thống. Nó là một lớp của hệ thống cơ sở để phần còn lại của phần mềm hoạt động trên màn hình init / svc-mgmt của riêng chúng. Tất cả s6 và 66 được viết bằng C và nó không phải là Linux cụ thể, hay cụ thể là glibc. Các máy chủ của Skarnet (s6 tác giả) đã hoạt động được gần một thập kỷ mà không có nhiều tạm dừng trên hệ thống được xây dựng tùy chỉnh musl. Hiện tại, Alpine, Void và Adelie cũng có phần mềm s6 trên kho của họ, Adelie sử dụng phần mềm này để giám sát dịch vụ theo mặc định. Void hiện mang 66 là tốt. Tôi không biết liệu và bất cứ ai mở rộng đã chuyển s6 sang xxBSD hoặc các hệ thống xxIX khác.

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.