Универсальный мониторинг сервисов в Linux

Не бросайте в меня камни заранее… Я знаю, что есть много программ, выполняющих мониторинг демонов в системе, НО… Мне очень захотелось сделать что-то крайне простое, а потому надёжное.

ЗАДАЧА:
1. мониторинг статуса демонов через «service»
2. возможность добавлять любые сервисы одним и тем же путём. А самое главное — быстро. (многие программы мониторинга имеют отдельные шаблоны для слежки за разными процессами, по этому добавлять новые сервисы не так удобно.)
3. Автоматический перезапуск сервиса, в случае если он «упал».
4. Игнорирование лежащего сервиса, если он остановлен намеренно.
5. Оповещение по почте о состоянии сервисов, за которыми мы следим.

Я не очень люблю баш скриптинг, по этому использовал мой любимый php-cli.

А вот собственно и сам скрипт:

#!/usr/bin/php
< ?php // settings $admin_email = 'great_administrator@server.com'; //Указываем, куда слать уведомления $subject = 'MYSERVER svc monitor'; // указываем тему письма оповещение. Так будет проще идентифицировать, с какого сервера оно пришло. $services = array( // добавляем любые сервисы в этот массив. 'nginx', 'mysql', 'squid', 'clamd', 'named', 'httpd' ); date_default_timezone_set('Europe/Moscow'); // тут небольшая фикса, касательно часового пояса. Если он и так прописан у вас в php.ini, это можно убрать... $header = "From: svcmon@myserver.com\nReply-to: svcmon@myserver.com\r\nContent-type: text/plain; charset=utf-8"; // а тут мы указываем заголовок письма. В нём указывается почта отправителя (для красоты :)), тип контента и, главное, кодировка письма. Можете менять на свою усмотрение... ///// foreach( $services as $svc ){ $try = svchk($svc); switch($try['retval']){ case 0: echo $svc ." is OK\n"; break; case 1: $msg = $svc." is in trouble!\nSTATUS MESSAGE: ".$try['msg']."\n Attemp to restart...\n"; if(system('sudo service '.$svc.' restart')){ $msg .= 'OK! Service has been restarted at '.date('c')."\n"; } else { $msg .= 'Sorry... Restart failed.'; } mail($admin_email,$subject,$msg,$header); echo $msg; break; case 3: $msg = $svc." is stopped...\n"; mail($admin_email,$subject,$msg,$header); echo $msg; break; default: $msg = $svc." has unexpected status. please, check.\nSTATUS MESSAGE: ".$try['msg']; mail($admin_email,$subject,$msg,$header); break; } } function svchk($name) { exec("sudo service ".$name." status", $out, $retval); $msg = ''; foreach( $out as $text ){ $msg .= $text."\n"; } $arr['msg'] = $msg; $arr['retval'] = $retval; return $arr; } ?>

сохраняем это в какой-нибудь удобный файл ( к примеру /root/svcmon.php ), устанавливаем права на исполнение chmod 755 /root/svcmon.php, и запихиваем в крон.

crontab -e

Чтобы скрипт делал проверку, скажем, каждые 5 минут — вбиваем в крон */5 * * * * php /root/svcmon.php &> /dev/null

Для проверки, убейте какой-нибудь из сервисов, прописанных в скрипте.

Наслаждайтесь! :)

© eXUnity TEAM 2004 - 2017