Linux : 여러 프로세스를 모니터링하기위한 워치 독 작성 프로세스 핸들

몇 년 전, 동료는 워치 독 프로그램을위한 우아한 솔루션을 고안했습니다. 이 프로그램은 Windows에서 실행되었고 Windows 이벤트 객체를 사용했습니다. 를 하여 여러 응용 프로그램의 프로세스 핸들 (PID)을 모니터링했습니다. 프로세스 중 하나가 예기치 않게 종료되면 프로세스 핸들이 더 이상 존재하지 않으며 그의 감시자에게 즉시 신호를 보냅니다. 그러면 감시자는 시스템을 “치유”하기 위해 적절한 조치를 취합니다.

제 질문은 리눅스에서 그러한 워치 독을 어떻게 구현하겠습니까? 단일 프로그램이 다른 많은 PID를 모니터링 할 수있는 방법이 있습니까?



답변

일반적으로 사용되는 기존의 휴대용 방법은 부모 프로세스가 자식을 감시하는 것입니다.

기본 프리미티브는 waitwaitpid 시스템 호출입니다. 하위 프로세스가 종료되면 상위 프로세스가 SIGCHLD신호를 수신하여 wait종료 한 하위 및 종료 상태를 알도록 호출해야 함 을 알려줍니다. 부모 프로세스는 대신 편의상 무시 SIGCHLD하고 호출 하도록 선택할 수 있습니다 waitpid(-1, &status, WNOHANG).

많은 프로세스를 모니터링하려면 동일한 부모에서 프로세스를 모두 생성하거나 원하는 프로그램을 호출하는 간단한 모니터링 프로세스를 통해 프로세스를 모두 호출하고 종료 될 때까지 기다렸다가 종료에 대해보고합니다 (쉘 구문). myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe . Windows 세계에서 온다면, 하나의 특수한 작업을 수행하는 작은 프로그램을 갖는 것이 Unix 세계에서 일반적인 디자인이며 OS는 프로세스를 저렴하게 만들도록 설계되었습니다.

프로세스가 종료되는시기를보고하고 선택적으로 다시 시작할 수있는 Monit , Supervise , Upstart 등의 프로세스 모니터링 (감독 자라고도 함) 프로그램이 많이 있습니다 .


답변

이 문제에 대한 나의 접근 방식은 init와 내장 respawn 지시문을 사용하여 실행해야 할 모든 것을 시작 / 다시 시작하는 것입니다. 이것이 원래 의도와 주요 목적이었습니다. 어떤 경우에는 프로세스가 종료 된 후 정리하거나 프로세스 시작을 준비하기 위해 스크립트를 실행해야합니다 (대부분의 작업은 동일 함). 대부분의 경우 exec로 끝나는 bash 스크립트가 이것에 효과적입니다.


답변