Linux: Viết một bộ theo dõi để theo dõi nhiều quy trình


14

Vài năm trước, một đồng nghiệp đã đưa ra một giải pháp tao nhã cho một chương trình theo dõi. Chương trình chạy trên Windows và sử dụng các đối tượng Sự kiện Windows để giám sát các xử lý quy trình (PID) của một số ứng dụng. Nếu bất kỳ một trong các quy trình bị chấm dứt bất ngờ, quy trình xử lý của nó sẽ không còn tồn tại và cơ quan giám sát của anh ta sẽ ngay lập tức được báo hiệu. Cơ quan giám sát sau đó sẽ có một hành động thích hợp để chữa lành hệ thống.

Câu hỏi của tôi là, làm thế nào bạn sẽ thực hiện một cơ quan giám sát như vậy trên Linux? Có cách nào để một chương trình duy nhất giám sát nhiều chương trình khác không?


Xem thêm Đảm bảo một quy trình luôn chạy cho danh sách các chương trình giám sát / giám sát.
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


17

Cách truyền thống, di động, thường được sử dụng là quy trình cha mẹ quan sát con cái của nó.

Các nguyên thủy cơ bản là các cuộc gọi waitwaitpid hệ thống. Khi một tiến trình con chết, tiến trình cha nhận được SIGCHLDtín hiệu, báo cho nó biết nên gọi waitđể biết con nào chết và trạng thái thoát của nó. Thay vào đó, tiến trình cha mẹ có thể chọn bỏ qua SIGCHLDvà gọi waitpid(-1, &status, WNOHANG)một cách thuận tiện.

Để giám sát nhiều quy trình, bạn sẽ sinh ra tất cả chúng từ cùng một cha mẹ hoặc gọi tất cả chúng thông qua một quy trình giám sát đơn giản chỉ cần gọi chương trình mong muốn, chờ cho nó kết thúc và báo cáo về việc chấm dứt (theo cú pháp shell myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe:). Nếu bạn đến từ thế giới Windows, lưu ý rằng việc có các chương trình nhỏ thực hiện một nhiệm vụ chuyên biệt là một thiết kế phổ biến trong thế giới Unix, HĐH được thiết kế để làm cho các quy trình trở nên rẻ.

Có nhiều chương trình giám sát quá trình (còn gọi là giám sát viên) có thể báo cáo khi một quá trình chết và tùy ý khởi động lại nó và hơn thế nữa: Monit , Supervise , Upstart , Rối


+1, chính xác những gì tôi đang tìm kiếm - cảm ơn bạn đã trả lời chi tiết như vậy.
Justin Ethier

0

Cách tiếp cận của tôi đối với vấn đề này là sử dụng init và chỉ thị hồi sinh tích hợp của nó để bắt đầu / khởi động lại bất cứ thứ gì bạn cần để chạy. Đây là mục đích ban đầu và mục đích chính của nó. Trong một số trường hợp, bạn sẽ cần chạy một kịch bản để dọn dẹp sau khi một quy trình đã chết hoặc để chuẩn bị cho quá trình bắt đầu (hầu hết thời gian công việc đều giống nhau). Trong hầu hết các trường hợp, một tập lệnh bash kết thúc bằng exec hoạt động rất tốt cho việc này.

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.