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

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

ЗАДАЧА:

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

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

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

#!/usr/bin/php
<?php 
$admin_email = '[email protected]'; //Указываем, куда слать уведомления 
$subject = 'MYSERVER svc monitor'; // указываем тему письма оповещение. Так будет проще идентифицировать, с какого сервера оно пришло. 
$services = array('nginx', 'mysql', 'squid', 'clamd', 'named', 'httpd');  // добавляем любые сервисы в этот массив. 
	
$header = "From: [email protected]\nReply-to: [email protected]\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

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

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