Cách tự động khởi động lại dịch vụ khi gặp lỗi trong Linux


23

Trên Windows, bạn có thể đặt điều gì sẽ xảy ra nếu / khi dịch vụ bị lỗi. Có cách tiêu chuẩn nào để đạt được điều tương tự trên Linux (cụ thể là CentOS) không?

Một phần lớn hơn trong câu hỏi của tôi là: làm thế nào để bạn xử lý các ổ cắm đã bị bỏ ngỏ - ví dụ như trong các trạng thái TIME_WAIT, FIN_WAIT1, v.v.

Hiện tại nếu dịch vụ tôi đang phát triển gặp sự cố, tôi phải đợi các ổ cắm để xóa hoặc thay đổi cổng nghe trước khi tôi có thể tự khởi động lại nó.

Cảm ơn bạn đã giúp đỡ.

Câu trả lời:


26

monitlà một cách tuyệt vời để giám sát và khởi động lại các dịch vụ khi chúng thất bại - và có thể bạn sẽ kết thúc việc sử dụng dịch vụ này cho các dịch vụ thiết yếu khác (như Apache). Có một bài viết hay về nixCraft chi tiết cách sử dụng cụ thể cho các dịch vụ này, mặc dù monitbản thân nó có nhiều chức năng hơn thế này.

Về khía cạnh ổ cắm, @galraen đã trả lời điểm này.


Đó là một sự xấu hổ tôi phải quyết định đó là những câu trả lời. Tôi nên đã hỏi hai câu hỏi riêng biệt. @gelraen câu trả lời của bạn vừa kết thúc tuần tìm kiếm giải pháp. Cảm ơn bạn rất nhiều! @Redmumba cảm ơn, Monit có vẻ tốt!
Pryo

Cho dù một bạn quyết định để đánh dấu chính xác, chắc chắn upvote @ gelraen của câu trả lời. Vị trí của nó trên chính xác, và rất nhiều thông tin.
Andrew M.

19

Chỉ trả lời phần khởi động lại dịch vụ. Tôi cũng đã bắt gặp Monit, nhưng trên hệ thống CentOS 7 sẽ chăm sóc tất cả những thứ đó cho bạn. Bạn chỉ cần thêm hai dòng này vào tệp .ervice (nếu chúng chưa có):

Restart=always
RestartSec=3

Xem https://jonarcher.info/2015/08/ensure-systemd-service-restart-on-failure/ để tham khảo.

Nếu bạn muốn tạo một dịch vụ systemd tùy chỉnh, việc viết tệp dịch vụ của riêng bạn khá đơn giản. Xem ví dụ dưới đây, cho một máy chủ http tùy chỉnh.

Bắt đầu trình chỉnh sửa với tệp dịch vụ mới:

vim /etc/systemd/system/httpd.service

Và thêm nội dung sau, bạn có thể chỉnh sửa theo yêu cầu:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Tôi muốn nó tự động khởi động khi khởi động:

systemctl enable httpd

Nói với systemd về những thay đổi và bắt đầu dịch vụ:

systemctl daemon-reload
systemctl start httpd

Và bây giờ bạn có thể thấy trạng thái:

systemctl status httpd

Để tham khảo, xem https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


Vâng, chính xác, systemdngười quản lý dịch vụ tiêu chuẩn trên hầu hết các bản phân phối phổ biến, có thể làm điều đó cho bạn.
Rolf

13

Bạn có thể gọi setsockopt(2)cho ổ cắm nghe SO_REUSEADDR, vì vậy bạn sẽ có thể bind(2)gọi lại mà không cần chờ hết hạn kết nối. Một khả năng khác: thả kết nối từ kernel. FreeBSD có tcpdroplệnh cho việc này, không biết về Linux.


4

Nếu distro linux của bạn sử dụng Upstart thay vì SysV init, thì respawntừ khóa sẽ thực hiện điều này.

http://upstart.ubfox.com/cookbook/#respawn


Cảm ơn, điều này trông giống như điều đó, nhưng thật không may, tôi bị mắc kẹt với SysV init.
Pryo
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.