Простой скрипт-пинговалка для Debian (решено)
Создана: 27 Мая 2011 Птн 14:02:53.
Раздел: "Разработка форума"
Сообщений в теме: 31, просмотров: 93310
-
Для повышения стабильности работы форма нужно решить такую задачку:
1) надо постоянно пинговать некий хост, и определять, пингуется он или нет
2) в случае если пинговался и перестал - выполнить одну команду
3) в случае если опять начал пинговаться - выполнить другую команду
в общем чтобы так оно всё время работало, как только меняется состояние пингуемости некоего хоста, надо выполнять ту или другую команду, одну на "онлайн", другую на "оффлайн"
насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение? -
AlexAdmin писал : Для повышения стабильности работы форма нужно решить такую задачку:
1) надо постоянно пинговать некий хост, и определять, пингуется он или нет
2) в случае если пинговался и перестал - выполнить одну команду
3) в случае если опять начал пинговаться - выполнить другую команду
#!/bin/bash
ping -c 1 xxx.xx
result=$?
if [ "result"=="0"]; then
выполняем свое, все пингуется
else
выполняем если не пингуется
fi
в кронтаб добавляем запись
*/1 * * * * root путь до нашего скрипта
и не важно, дебиан - не дебиан, это юникс, разницы как писать нет -
-
Он имеет ввиду, что нужно где-то сохранять последнее состояние, и если оно изменилось - проводить действия. А сейчас будет каждые условные 5 минут слаться сообщение о том, что сервер оффлан, а когда выйдет онлайн - ничего не произойдёт (или будет происходить каждые те же 5 условных минут).evgenyk писал : Ну если не пингуется, значит оффлайн, верно? -
Код: #!/bin/bash
host="ya.ru"
state=`cat /etc/state` # В нем храним последнее состояние
count=1
inc=1
threshold=3 # Порог, по превышении которого считаем что хост устойчиво работает
for i in `seq 1 5`
do
ping -c1 -w1 $host
result=$?
if [ "result"=="0"]; then
echo "online">/etc/state
cstate="online"
count=$(($count + $inc)) # Считаем, сколько раз ответил хост
else
echo "offline">/etc/state
cstate="offline"
fi
done
if [ "$count" -ge "$threshold" ]; then
if [ "$state"!="cstate" ]; then
Состояние изменилось, запускаем то, что надо
fi
fi -
-
Спасибо "человеку свыше" за подсказку идеологии скрипта, я на этой основе написал по аналогии то, что вроде бы даже работает:
Код:
#!/bin/bash
host="8.8.4.4"
stafil="/etc/old-state-"$host #Файл, где хранится предыдущее состояние хоста
threshold=3 # Порог, выше которого считаем что хост online
count=0
for i in `seq 1 3`
do
ping -c1 -w1 $host >/dev/null
if [ $? -eq 0 ]; then
count=$(($count + 1))
fi
done
if [ "$count" -ge "$threshold" ]; then
newsta=1
else
newsta=0
fi
oldsta=$(cat "$stafil")
if [ $? -ne 0 ]; then
oldsta=0
fi
if [ $oldsta -ne $newsta ]; then
echo $newsta>"$stafil"
if [ $newsta -eq 1 ]; then
echo "Do it when $host go ONLINE"
else
echo "Do it when $host shut down"
fi
fi
Осталось ввести реальные адреса и командочки и прикрутить это к крону и потестить...
А где можно почитать описание командочек, доступных в этом языке? Извиняюсь за невежество, просто язычок-то вроде занимательный -
[внешняя ссылка]
поставь /dev/null 2>&1, иначе вывод с stderr будет падать в лог -
Все же вышеприведенный скрипт делает несколько не то, что просил тс, как я понял команды выполняются разные в зависимости от состояния..
Переделал слегка, да простит меня evgenyk
Код: #!/bin/bash
host="ya.ru"
state=`cat /etc/state` # В нем храним последнее состояние
count=0
threshold="3" # Порог, по превышении которого считаем что хост устойчиво работает
for i in {1..5}
do
ping -c1 -w1 $host
result=$?
if [[ "$result" == "0" ]]; then
let count=$count+1 # Считаем, сколько раз ответил хост
fi
done
if [[ $count > $threshold ]]; then
echo "online">/etc/state
cstate="online"
else
echo "offline">/etc/state
cstate="offline"
fi
if [[ $state != $cstate ]] && [[ $state = "online" ]]; then
echo '2) в случае если пинговался и перестал - выполнить одну команду ' # Заменить на команду
elif [[ $state != $cstate ]] && [[ $state = "offline" ]]; then
echo '3) в случае если опять начал пинговаться - выполнить другую команду ' # Заменить на команду
fi -
-
AlexAdmin писал : ага, спасибо, а как в кронтаб добавлять запуск этого скрипта, и куда такие скрипты лучше положить?
сейчас например он "/root/test.sh"
и как его заставить выполняться, например, раз в 10 секунд?
в файл /etc/crontab дописываешь строку
*/1 * * * * root /root/test.sh и после нее добавляешь пустую строку.
У крона минимальная периодичность минута. -
да, с кроном 10 сек не получится..
как вариант - сделать следующим образом:
while true
do
весь вышенаписанный код
sleep 10
done
и запустить без крона, добавив в конце &
А в крон поставить скрипт на проверку работы этого процесса, и перезапуска в случае его отсутствия (Это если совсем заняться нечем ) -
Вот слегка подпилил код с учетом всего вышесказанного:
Код:
#!/bin/bash
host="8.8.4.4"
stafil="/etc/old-state-"$host #Файл, где хранится предыдущее состояние хоста
threshold=3 # Порог, выше которого считаем что хост online
count=0
for i in {1..3}
do
ping -c1 -w1 $host >/dev/null 2>&1
if [ $? -eq 0 ]; then
count=$(($count + 1))
fi
done
if [ "$count" -ge "$threshold" ]; then
newsta=1
else
newsta=0
fi
oldsta=$(cat "$stafil" 2>/dev/null)
if [[ "$oldsta" != "1" ]] && [[ "$oldsta" != "0" ]] ; then
oldsta=0
echo $newsta>"$stafil"
fi
if [ $oldsta -ne $newsta ]; then
echo $newsta>"$stafil"
if [ $newsta -eq 1 ]; then
echo "Do it when $host go ONLINE"
else
echo "Do it when $host shut down"
fi
fi
щас буду экспериментировать с кроном...
а, кстати, после того как я файл /etc/crontab исправляю, надо как-то крон рестартить или он сам поймет что параметры изменились?
вообще, конечно, по хорошему бы проверку раз в 5-10 секунд проводить бы следовало, чтобы максимально ускорить реакцию на событие...