Linux: Написание сторожевого таймера для мониторинга нескольких процессов


14

Несколько лет назад коллега изобрел элегантное решение для сторожевой программы. Программа работала в Windows и использовала объекты событий Windows для мониторинга дескрипторов процесса (PID) нескольких приложений. Если какой-либо из процессов будет неожиданно завершен, его дескриптор процесса больше не будет существовать, и его сторожевой таймер будет немедленно сигнализирован. Затем сторожевой механизм предпримет соответствующее действие, чтобы «исцелить» систему.

Мой вопрос: как бы вы реализовали такой сторожевой таймер в Linux? Есть ли способ для одной программы контролировать PID многих других?


См. Также Убедитесь, что процесс всегда запущен для списка программ мониторинга / контроля.
Жиль "ТАК - перестань быть злым"

Ответы:


17

Традиционный, портативный, широко используемый способ заключается в том, что родительский процесс следит за своими потомками.

Основными примитивами являются waitиwaitpid системные вызовы. Когда дочерний процесс умирает, родительский процесс получает SIGCHLDсигнал, сообщающий, что ему следует позвонить, waitчтобы узнать, какой ребенок умер, и его статус выхода. Родительский процесс может вместо этого выбрать игнорировать SIGCHLDи вызватьwaitpid(-1, &status, WNOHANG) по своему усмотрению.

Для мониторинга многих процессов вы должны либо порождать их все от одного и того же родителя, либо вызывать их всех через простой процесс мониторинга, который просто вызывает нужную программу, ожидает ее завершения и сообщает о завершении (в синтаксисе оболочки: myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe . Если вы выходец из мира Windows, обратите внимание, что наличие небольших программ, выполняющих одну специализированную задачу, является обычной конструкцией в мире Unix, ОС предназначена для удешевления процессов.

Существует множество программ мониторинга процессов (также называемых супервизорами), которые могут сообщать о смерти процесса и, при необходимости, перезапускать его и многое другое: Monit , Supervise , Upstart ,…


+1, именно то, что я искал - спасибо за такой подробный ответ.
Джастин Этье

0

Мой подход к этой проблеме заключается в использовании init и встроенной директивы респауна для запуска / перезапуска всего, что вам нужно для запуска. Это было его первоначальное намерение и основная цель. В некоторых случаях вам потребуется запустить сценарий для очистки после того, как процесс завершился, или подготовиться к запуску процесса (в большинстве случаев работа выполняется одинаково). В большинстве случаев сценарий bash, заканчивающийся на exec, отлично подходит для этого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.