Systemd có thể phát hiện và tiêu diệt các quá trình hung?


16

Trong khi làm việc với một giải pháp sử dụng khóa tập tin, tôi tin rằng mã của tôi đang rơi vào bế tắc. Tôi đang sử dụng systemd để khởi động quá trình khởi động hệ thống. Sử dụng báo động (3) là một tùy chọn, nhưng tôi đã tự hỏi liệu có cách nào để systemd phát hiện các quy trình treo và khởi động lại chúng không?

Hiện tại để khắc phục vấn đề này, tôi đang dự định xem xét sản lượng tạp chí và nếu nó không thay đổi trong một khoảng thời gian xác định, thì tôi sẽ giết quá trình thông qua tập lệnh shell.

Chỉ tự hỏi liệu có cách nào tốt hơn để giám sát các quy trình thông qua systemd hay không.


Chắc là không. Làm thế nào để bạn biết nếu quá trình được treo? Điều gì nếu bạn thực sự cần một cái gì đó như thế for(;;) do_something();nào?
mvp 16/12/13

4
Nói đúng ra, nếu mã của bạn bị treo, bạn nên gỡ lỗi vấn đề đó. Giết nó thông qua systemd (giả sử nó có thể được thực hiện, điều mà tôi không tin) hoặc theo bất kỳ cách nào khác là điều thích hợp để làm khi bạn gỡ lỗi. Nhưng bạn không thể để nó tự do đi vào bế tắc.
MariusMatutiae

Câu trả lời:


25

Đúng; nhưng trước tiên hãy sửa chương trình lỗi của bạn trước khi xử lý với systemd.

MariusMatutiae hoàn toàn chính xác. Bạn có một vấn đề với chương trình của bạn. Nó bế tắc. Đấu tranh với systemd không phải là câu trả lời. Tốt nhất, đó là một sự xao lãng. Sửa chương trình của bạn để nó không bị hỏng. Hướng năng lượng của bạn vào điều đúng đắn.

Điều đó nói rằng, những người khác sẽ đến đây vì tiêu đề câu hỏi, chứ không phải là câu hỏi thích hợp. Vì lợi ích của họ, đây là câu trả lời cho tiêu đề, bỏ qua câu hỏi thích hợp:

Có, systemd có thể giám sát các mons và tự động khởi động lại chúng nếu chúng ngừng nói. Không chỉ là bất kỳ người già nào, mặc dù. Như mvp lưu ý, không có cách nào để biết rằng một dmon đã bị treo (trong vũ trụ này, nơi mà vấn đề tạm dừng là không thể giải quyết được, ít nhất là). Cả systemd và bất kỳ chương trình máy tính nào khác đều không có khả năng suy luận từ đầu rằng một số chương trình ngẫu nhiên ném vào chúng đã bế tắc, hoặc đi vào một vòng lặp vô hạn, hoặc bất cứ điều gì. Điều tốt nhất mà bạn sẽ nhận được ở đây là phát hiện ra rằng một người đã không thực hiện thao tác "nhịp tim" thường xuyên trong khoảng thời gian cần thiết.

Do đó, các lợi ích của các khả năng theo dõi của systemd phải được viết để nói một giao thức dành riêng cho systemd, giao thức sd_notify. Điều này làm phức tạp mã dæmon một chút. Điều đó còn phức tạp hơn nữa bởi vì các dons nên, nếu được viết đúng, hãy kiểm tra xem chúng có được gọi với chức năng watchdog hay không.

Một người nói giao thức này sử dụng khả năng theo dõi của systemd

  • Phải kiểm tra WATCHDOG_USECbiến môi trường;
  • Phải gọi sd_notify () liên tục và thường xuyên, trong suốt vòng đời của nó, với WATCHDOG=1tùy chọn được đặt, trong khoảng thời gian khoảng WATCHDOG_USEC/ 2 ("USEC" là viết tắt của micro giây);
  • Phải Type=notifyđặt trong tập tin đơn vị của nó;
  • Nên đặt NotifyAccess=main(hoặc =all) trong tập tin đơn vị của nó;
  • Phải có WatchdogSec=giây đặt trong tập tin đơn vị của nó.
  • Liên kết phải liên kết với libsystemd-daemon.so

Nếu bạn muốn biết chi tiết về mã hóa này, sau khi đọc hướng dẫn, hãy đảm bảo rằng bạn đi đến StackExchange đúng. Đây là SuperUser. StackOverflow ở đằng kia .

đọc thêm


2
Tất nhiên, tôi phải khắc phục sự cố, ý định duy nhất của tôi là có một bản hack tạm thời cho đến khi tôi tìm ra vấn đề. Cảm ơn các câu trả lời chi tiết.
freethinker
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.