Традиционный, портативный, широко используемый способ заключается в том, что родительский процесс следит за своими потомками.
Основными примитивами являются wait
иwaitpid
системные вызовы. Когда дочерний процесс умирает, родительский процесс получает SIGCHLD
сигнал, сообщающий, что ему следует позвонить, wait
чтобы узнать, какой ребенок умер, и его статус выхода. Родительский процесс может вместо этого выбрать игнорировать SIGCHLD
и вызватьwaitpid(-1, &status, WNOHANG)
по своему усмотрению.
Для мониторинга многих процессов вы должны либо порождать их все от одного и того же родителя, либо вызывать их всех через простой процесс мониторинга, который просто вызывает нужную программу, ожидает ее завершения и сообщает о завершении (в синтаксисе оболочки: myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe
. Если вы выходец из мира Windows, обратите внимание, что наличие небольших программ, выполняющих одну специализированную задачу, является обычной конструкцией в мире Unix, ОС предназначена для удешевления процессов.
Существует множество программ мониторинга процессов (также называемых супервизорами), которые могут сообщать о смерти процесса и, при необходимости, перезапускать его и многое другое: Monit , Supervise , Upstart ,…