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


14

Кілька років тому колега придумала елегантне рішення для програми сторожових собак. Програма працювала в Windows і використовувала об'єкти Windows Event для моніторингу обробки процесів (PID) декількох додатків. Якщо будь-який з процесів несподівано припинився, його обробка не буде більше існувати, і його сторожовий пес негайно отримає сигнал. Тоді сторожова особа вживе відповідних заходів для «оздоровлення» системи.

Моє запитання: як би ви реалізували таку сторожову службу в Linux? Чи існує можливість для однієї програми контролювати PID-адреси багатьох інших?


Див. Також Переконайтесь, що процес завжди працює за списком програм моніторингу / контролю.
Жил 'ТАК - перестань бути злим'

Також дивіться stackoverflow: stackoverflow.com/questions/9400724/…
Майк Пеннінгтон

Відповіді:


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-скрипт, який закінчується у виконанні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.