Не бросайте в меня камни заранее… Я знаю, что есть много программ, выполняющих мониторинг демонов в системе, НО… Мне очень захотелось сделать что-то крайне простое, а потому надёжное.
ЗАДАЧА:
- мониторинг статуса демонов через “service”
- возможность добавлять любые сервисы одним и тем же путём. А самое главное – быстро. (многие программы мониторинга имеют отдельные шаблоны для слежки за разными процессами, по этому добавлять новые сервисы не так удобно.)
- Автоматический перезапуск сервиса, в случае если он “упал”.
- Игнорирование лежащего сервиса, если он остановлен намеренно.
- Оповещение по почте о состоянии сервисов, за которыми мы следим.
Я не очень люблю баш скриптинг, по этому использовал мой любимый php-cli.
А вот собственно и сам скрипт:
#!/usr/bin/php
<?php
$admin_email = 'great_administrator@server.com'; //Указываем, куда слать уведомления
$subject = 'MYSERVER svc monitor'; // указываем тему письма оповещение. Так будет проще идентифицировать, с какого сервера оно пришло.
$services = array('nginx', 'mysql', 'squid', 'clamd', 'named', 'httpd'); // добавляем любые сервисы в этот массив.
$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
Для проверки, убейте какой-нибудь из сервисов, прописанных в скрипте.
Наслаждайтесь! :)