Cách đơn giản để khởi động lại các quá trình bị lỗi?


10

Tôi cần theo dõi một số quy trình đang chạy trên máy chủ web của mình. Vì một số lý do, vecni hiện đang gặp sự cố một hoặc hai ngày một lần. Tôi đang sử dụng monit để tự động khởi động lại véc ni, nhưng nó không hoạt động. Đây là mục monit.conf của tôi cho Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

Tệp nhật ký cho thấy sau khi vecni ngừng chạy, tất cả đã cố gắng khởi động lại sau đó đều thất bại. Sau đó cuối cùng monit dừng theo dõi véc ni.

Bất cứ ai có đề nghị làm thế nào tôi có thể khắc phục điều này? Hoặc tốt hơn nữa, bạn có thể đề xuất các cách đơn giản khác để tự động theo dõi và khởi động lại các quy trình bị lỗi không? Cảm ơn!


Tôi không thể tin được những điều như vậy khó khăn như thế nào trong thời kỳ tiền hệ thống.
Fl0v0

Câu trả lời:


17

Tôi sẽ tìm đến daemontools ( http://cr.yp.to/daemontools.html ).

Supervise được xây dựng cho chính xác mục đích này - để bắt đầu các quy trình và xem chúng, khởi động lại chúng ngay lập tức nếu chúng chấm dứt.

Bạn vẫn có thể sử dụng monit nếu bạn cần làm bất cứ điều gì phức tạp hơn kiểm tra "nó vẫn đang chạy" đơn giản và nếu quá trình cần phải được khởi động lại, thì hãy thực hiện điều đó thông qua giám sát.


Tôi cũng sử dụng daemontools để theo dõi các quy trình dịch vụ không ổn định. Khá tiện nếu tôi phải nói. :-)
edomaur


2

Bạn có thể sử dụng tập lệnh xử lý sự kiện với Nagios nếu bạn có sẵn điều đó để khởi động lại dịch vụ.

Nếu véc ni yêu cầu quyền root để bắt đầu (init.d scripts thường làm) thay đổi "/etc/init.d/varnish start" thành "sudo /etc/init.d/varnish start". Nhưng điều đó có lẽ sẽ không đủ vì bạn có thể không muốn cung cấp bất cứ thứ gì mà người dùng sử dụng vì tất cả các đặc quyền sudo nopasswd cho tất cả các lệnh và đưa sudo vào tập lệnh shell về cơ bản cũng tệ như vậy. Vì vậy, bạn sẽ cần phải tìm ra các lệnh nào trong tập lệnh init đó cần sudo, cung cấp các lệnh đó sudo đặc quyền trong tệp / etc / sudoers cho người dùng monit và cuối cùng chỉnh sửa tập lệnh init đó. Hoặc có thể thay vì tất cả các vecni này có thể được chạy như người dùng không root?

Cuối cùng, tôi chắc chắn bạn biết điều này nhưng tôi sẽ nói dù sao đi nữa. Bạn rõ ràng đang nỗ lực rất nhiều vào việc này, tôi hy vọng bạn sẽ nỗ lực hết sức để tìm ra lý do tại sao vecni bị hỏng và thực sự khắc phục nó (hoặc làm cho các nhà phát triển tìm ra lý do tại sao) :-)

Cập nhật:
Điều này có thể không sạch sẽ, nhưng một cách dễ dàng để thực hiện điều này vì root có thể là thiết lập một tập lệnh kiểm tra xem quy trình có ổn không và nếu không khởi động nó. Sau đó, chỉ cần chạy kịch bản đó cứ sau vài phút là một công việc định kỳ.


Tôi đã xem xét Nagios lúc đầu, nhưng muốn một cái gì đó nhỏ và đơn giản cho mục đích của tôi. Và vâng, tôi đang xem xét vấn đề Varnish. Một trong những máy chủ của tôi đã chạy ổn định trong một thời gian rất dài, vì vậy nó chắc chắn phải làm với tôi. :(
Lin

1

Một phương pháp tuyệt vời khác được lấy từ StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Điều này có thể được thêm vào crontab:

crontab -e

Sau đó thêm quy tắc để bắt đầu tập lệnh màn hình của bạn:

@reboot /usr/local/bin/myservermonitor

Hoặc được thêm dưới dạng tập lệnh trong /etc/init.d

Xem câu trả lời StackOverflow để được giải thích chi tiết về lý do tại sao đây là một cách tiếp cận tốt.


0

Tôi cũng đang tìm kiếm cách đơn giản nhất để xử lý vấn đề này. Cách dễ nhất tôi có thể tìm thấy là chỉ cần thêm Restart=allwaysvào .servicetệp liên quan ở /etc/systemd/system/multi-user.target.wants/dòng cuối cùng của [service]thẻ.

Sau đó làm sudo systemctl daemon-reloadtheo sudo systemctl restart service.serviceđể tải lại các thay đổi.

Bạn có thể kiểm tra bằng cách kiểm tra xem dịch vụ có đang chạy không : systemctl status processname, kiểm tra dấu thời gian bắt đầu. Sau đó ps -ef | grep servicename, ad giết tiến trình với id vừa tìm thấy kill 1234. sau đó làm systemctl status processnamelại và kiểm tra xem dấu thời gian bắt đầu có được cập nhật không.

Nó nên hoạt động trên:

  • Debian 7 và Debian 8
  • Ubuntu 15.04 trở lên
  • CentOS 7 và tương lai
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.