Разработка процесса мониторинга для мониторинга и перезапуска процессов - PullRequest
2 голосов
/ 08 ноября 2010

Я проектирую процесс мониторинга.Задача процесса мониторинга - отслеживать несколько настроенных процессов.Когда процесс монитора обнаруживает, что процесс вышел из строя, он должен перезапустить процесс.

Я разрабатываю код для моей системы Linux.Вот как я разработал небольшой прототип - поделился деталями (пути, аргументы) о различных процессах, которые необходимо отслеживать.- Процесс мониторинга сделал следующее: 1. Установил обработчик сигнала для SIGCHLD 2. Разветвление и execv для запуска процесса, подлежащего мониторингу.Сохраните pid дочерних процессов.3. Когда ребенок ушел, родитель получает SIGCHLD 4. Теперь будет вызван обработчик сигнала.Обработчик запустит цикл for в списке пидов, сохраненных ранее.Для каждого pid он проверяет файловую систему / proc на наличие каталога, соответствующего pid.Если каталог не существует, процесс перезапускается.

Теперь у меня такой вопрос: является ли описанный выше метод (для проверки файловой системы / proc) стандартным или рекомендуемым механизмом проверки, запущен ли процесс, или я должен сделать что-то вроде создания канала для команды psи цикл через вывод пс?- Есть ли лучший способ выполнить мое требование?

С уважением.

Ответы [ 4 ]

4 голосов
/ 09 ноября 2010

Вы не должны проверять /proc, чтобы определить, какой процесс завершился - возможно, что другой, не связанный процесс, тем временем запустится и ему по совпадению будет присвоен тот же PID.

Вместо этого в вашем обработчике SIGCHLD вы должны использовать системный вызов waitpid() в цикле, таком как:

int status;
pid_t child;

while ((child = waitpid(-1, &status, WNOHANG)) > 0)
{
    /* Process with PID 'child' has exited, handle it */
}

(цикл необходим, потому что несколько дочерних процессов могут завершиться в течение короткого периода времени, но может получиться только один SIGCHLD).

2 голосов
/ 09 ноября 2010

Посмотрим, понял ли я вас.У вас есть список детей, и вы запускаете цикл на / proc в своем обработчике SIGCLD, чтобы увидеть, какие дети еще живы, не так ли?

Это не очень обычно, ... и этоУжасно,

Обычно вы запускаете цикл while((pid = waitpid(-1, &status, WNOHANG))) в обработчике SIGCLD и используете возвращенный pid и макросы Wxxx, чтобы поддерживать список своих детей в актуальном состоянии.

Обратите внимание, чтоwait() и waitpid() безопасны для асинхронного сигнала.Функции, которые вы вызываете для проверки /proc, вероятно, нет.

1 голос
/ 09 ноября 2010

Посмотрите на супервизор .Отлично работает.

0 голосов
/ 09 ноября 2010

Вы можете легко определить, активен ли процесс, выполнив системный вызов kill() для его pid. Если ребенок не жив, kill() не удастся.

Кроме того, вызов waitpid() с параметром WNOHANG немедленно вернет ноль, если процесс еще жив.

ИМХО, чтение файлов proc или передача в ps - отвратительный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...