몇 년 전, 동료는 워치 독 프로그램을위한 우아한 솔루션을 고안했습니다. 이 프로그램은 Windows에서 실행되었고 Windows 이벤트 객체를 사용했습니다. 를 하여 여러 응용 프로그램의 프로세스 핸들 (PID)을 모니터링했습니다. 프로세스 중 하나가 예기치 않게 종료되면 프로세스 핸들이 더 이상 존재하지 않으며 그의 감시자에게 즉시 신호를 보냅니다. 그러면 감시자는 시스템을 “치유”하기 위해 적절한 조치를 취합니다.
제 질문은 리눅스에서 그러한 워치 독을 어떻게 구현하겠습니까? 단일 프로그램이 다른 많은 PID를 모니터링 할 수있는 방법이 있습니까?
답변
일반적으로 사용되는 기존의 휴대용 방법은 부모 프로세스가 자식을 감시하는 것입니다.
기본 프리미티브는 wait
및waitpid
시스템 호출입니다. 하위 프로세스가 종료되면 상위 프로세스가 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 스크립트가 이것에 효과적입니다.