Простой скрипт-пинговалка для Debian (решено)
Создана: 27 Мая 2011 Птн 14:02:53.
Раздел: "Разработка форума"
Сообщений в теме: 31, просмотров: 91995
-
Для повышения стабильности работы форма нужно решить такую задачку:
1) надо постоянно пинговать некий хост, и определять, пингуется он или нет
2) в случае если пинговался и перестал - выполнить одну команду
3) в случае если опять начал пинговаться - выполнить другую команду
в общем чтобы так оно всё время работало, как только меняется состояние пингуемости некоего хоста, надо выполнять ту или другую команду, одну на "онлайн", другую на "оффлайн"
насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение? -
Итак, вот итоговый "боевой" вариант скрипта:
( файл /etc/pingwa/pingwa.sh )
Код: #!/bin/bash
host=$1
selfname="pingwa"
selfpath="/etc/$selfname"
logfil="$selfpath/$selfname.log" #сюда бум писать события онлайн/оффлайн
threshold=2 # Порог, выше которого считаем что хост online
stafil="$selfpath/old-state-"$host #Файл, где хранится предыдущее состояние хоста
#подсчитаем количество аналогичных процессов:
ccnt=$( ps ax | grep -v grep | grep $selfname\.sh | grep -c $host )
if [ $ccnt -ge 3 ]; then #если процессов и так шибко много, завершаемся
msg="Already running $selfpath/$selfname.sh $host"
echo $(date) $msg >>$logfil
echo $msg
exit 0
fi
if [ "$2" == "new" ]; then #Параметр new сотрет последнее запомненное состояние хоста
rm -f $stafil
fi
msg="Watching host $host"
echo $msg
echo $(date) $msg >>$logfil
while true
do
count=0
for i in {1..5}
do
ping -c1 -w1 $host &>/dev/null
if [ $? -eq 0 ]; then # посчитаем кол-во успешных пингов
count=$(($count + 1))
fi
done
if [ "$count" -ge "$threshold" ]; then #если мы набрали хотя бы 2 ответа из 5
newsta=1 #то, будем считать что хост онлайн
else
newsta=0 #иначе - оффлайн
fi
oldsta=$(cat "$stafil" 2>/dev/null)
if [[ "$oldsta" != "1" ]] && [[ "$oldsta" != "0" ]]; then
oldsta=9 # так любое состояние хоста ниже будет считаться отличающимся от предыдущего
fi
if [ $oldsta -ne $newsta ]; then # если новое состояние хоста отличается от предыдущего
echo $newsta>"$stafil"
if [ $newsta -eq 1 ]; then
event="ONLINE"
#связь с сервером восстановлена - запускаем nginx
nginx 2>>$logfil
else
event="shut down"
#связь с сервером потеряна - вырубаем nginx
#nginx -s stop 2>>$logfil
service nginx stop
fi
event="host: $host $event"
echo $event
echo $(date) $event >>$logfil
fi
sleep 3
done
И для /etc/crontab
Код: */1 * * * * root [ $(ps -aef | grep -c pingwa.sh) -ge 3 ] || (/etc/pingwa/pingwa.sh 192.168.80.2&) &>/etc/pingwa/cron
А понадобился он для того, чтобы в том случае если, почему-то пропала связь с базовым сервером, убивать nginx. Ну а когда связь с сервером восстановилась - сразу подымать nginx.
Иначе получается так: связь с базовым сервером пропадает, а nginx продолжает работать, и клиенты успешно цепляются браузерами на нерабочую "морду", и в ответ через какое-то время получают нечто вроде 404 File not found. Причем зеркальные сервера, может быть, в это время прекрасно работают, но клиентский браузер их использовать даже не пытается, потому что он и так вполне успешно устанавливает соединение.
Чтобы обломать браузер с установкой соединения на нерабочую "морду" - убиваем nginx, тогда браузер не может на неё законнектиться и вынужден автоматически пробовать другой айпишник из доступного списка. То есть в таком случае он вынужден отстать от "умершей морды" и перейти на другую "морду", а она, может быть, работает.