zlmon (ZeroLab Monitor) - Мониторинг доступности серверов

Иногда стоит простая задача отслеживания доступности сервера в сети, но при этом разворачивать полноценные системы мониторинга может оказаться попросту нецелесообразно и долго.

Поэтому я написал небольшой shell-скрипт, решающий исключительно эту узкую задачу – zlmon (ZeroLab Monitor).

zlmon.sh:

#!/bin/bash
# --------------------------------------------
# zlmon (ZeroLab Monitor):
# Written by ZeroChaos
# Version 1.0, 2015-02-17
# Site: https://zerolab.net/
# --------------------------------------------
DIR=$(dirname "$0")
HOSTLIST=$DIR/hostlist.txt
SUBJECT="Alert: Host down!"
EMAIL="[email protected]"
while read ADDRESS; do
	if [ ! -f /tmp/zlmon-$ADDRESS ]; then
		echo 0 > /tmp/zlmon-$ADDRESS
	fi
	COUNT=`head -1 /tmp/zlmon-$ADDRESS`
	if ping -c 1 -s 1 -W 1 $ADDRESS; then
		echo 0 > /tmp/zlmon-$ADDRESS
	else
		# Notify (no more than 5 times)
		if [ $COUNT -lt 5 ]; then
			echo -e "Connection Lost!\n\nHost: $ADDRESS\nTime: `date +'%Hh%Mm'`" | mail -s "$SUBJECT ($ADDRESS)" $EMAIL
		fi
		((COUNT++))
		echo $COUNT > /tmp/zlmon-$ADDRESS
		# Clear counter
		if [ $COUNT -gt 60 ]; then
			echo 0 > /tmp/zlmon-$ADDRESS
		fi
	fi
done < $HOSTLIST

Рядом со скриптом создаем файл hostlist.txt, содержащий адреса серверов, которые необходимо мониторить (это может быть как доменное имя, так и IP адрес):

msilab.net
zerolab.net
ruslab.net
[do not delete this string]

Добавляем скрипт в cron, запускать будем каждую минуту:

*/1 * * * * /usr/sh/zlmon/zlmon.sh

Не забудьте прописать свой 'EMAIL'. При недоступности сервера скрипт будет высылать уведомление на вашу почту, но не более 5 уведомлений подряд для недоступного сервера, после этого включается "mute" режим. В ином случае вашу почту просто засыпало бы однотипными уведомлениями. Через час счетчик сбрасывается и если сервер не стал доступен (сам, либо же вы его "подняли"), то вам снова начнут приходить уведомления.

Так как проверка проводится при помощи утилиты ping, не забывайте, у проверяемого на доступность сервера не должен "резаться" ICMP протокол.