Простой скрипт-пинговалка для Debian (решено)
Создана: 27 Мая 2011 Птн 14:02:53.
Раздел: "Разработка форума"
Сообщений в теме: 31, просмотров: 92035
-
Для повышения стабильности работы форма нужно решить такую задачку:
1) надо постоянно пинговать некий хост, и определять, пингуется он или нет
2) в случае если пинговался и перестал - выполнить одну команду
3) в случае если опять начал пинговаться - выполнить другую команду
в общем чтобы так оно всё время работало, как только меняется состояние пингуемости некоего хоста, надо выполнять ту или другую команду, одну на "онлайн", другую на "оффлайн"
насколько я представляю, это должен быть некий скрипт, который надо как-то заставить автозапускаться и всё время выполяться. Не хочу изобретать велосипед, да и скриптов под Debian я никогда не писал, может быть кто подскажет решение? -
-
-
-
ну в общем в кроне работает, но это минимум 1 минута.
а как добиться чтобы всё время в памяти висело, автозапускалось после ребута?
я не совсем понял что значит "и запустить без крона, добавив в конце &"
upd. а, понял, это запуск скрипта в отдельном потоке, выдаётся номер, который потом можно убить через kill номер
а как автопроверку сделать, что скрипт запущен? наверняка решение стандартное какое-то есть -
например добавить /root/test.sh в rc.local или [внешняя ссылка]AlexAdmin писал :а как добиться чтобы всё время в памяти висело, автозапускалось после ребута?
/root/test.sh & запускается в параллельном потокеAlexAdmin писал :я не совсем понял что значит "и запустить без крона, добавив в конце &"
Написать еще один скрипт для его проверки, а для его проверки еще один скрипт, а для его проверки еще од.............AlexAdmin писал :и как автопроверку сделать, что скрипт запущен? наверняка решение стандартное какое-то есть -
-
я думаю запустить этот скрипт без крона, а при помощи крона организовать проверку его запущености.
сам скрипт ( /etc/pingwa/pingwa.sh ) на данный момент выглядит так:
Код:
#!/bin/bash
host=$1
stafil="/etc/pingwa/old-state-"$host #Файл, где хранится предыдущее состояние хоста
threshold=3 # Порог, выше которого считаем что хост online
while true
do
count=0
for i in {1..4}
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 #либо $newsta, смотря как реагировать на старте
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
sleep 5
done
то есть предполагается вызов с параметром "хост".
и файлы состояний хранит в папке /etc/pingwa/ -
Если брать твой пример, то в крон нужно будет вписать
*/1 * * * * root [ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/root/pingwa.sh)
Должно работать по идее..
evgenyk писал :ага, только она vi запускает. Ты хочешь чтобы у него мозг совсем взорвался?
У меня везде нано запускает, по крайней мере на дебиане.. -
О, я придумал как сделать:
надо сделать проверку, есть ли уже аналогичный процесс - если есть, то завершаться, если нет - то работать "до победного конца"
Тогда такую задачу можно засунуть в крон.
Если процесс почему-то погиб, то крон его запустит, процесс увидит что он единственный такой, и будет работать. А если увидит что уже есть другой аналогичный процесс, то сразу завершится.
Только тогда вот что не понятно мне:
а как вообще крон отнесётся к тому, что задача запустилась и никогда не кончилась? Нужен ли крону какой-то особый признак, что запущенная задача не предполагает завершения, или же крону просто пофигу и он только стартует задачу не обращая внимания на то чем дело кончится?
А код пока получается примерно такой: ( /etc/pingwa/pingwa.sh )
Код:
#!/bin/bash
host=$1
selfname="pingwa"
selfpath="/etc/$selfname"
stafil="$selfpath/old-state-"$host #Файл, где хранится предыдущее состояние хоста
threshold=2 # Порог, выше которого считаем что хост online
#подсчитаем количество аналогичных процессов:
ccnt=$( ps ax | grep -v grep | grep $selfname\.sh | grep -c $host )
if [ $ccnt -ge 3 ]; then #если процессов и так шибко много, завершаемся
echo "Already running $selfpath/$selfname.sh $host"
exit 0
fi
if [ "$2" == "new" ]; then #Параметр new сотрет последнее запомненное состояние хоста
rm -f $stafil
fi
echo "Watching changes host $host"
while true
do
count=0
for i in {1..5}
do
ping -c1 -w1 $host >/dev/null 2>&1
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
echo "Do it when $host go ONLINE"
else
echo "Do it when $host shut down"
fi
fi
sleep 5
done
-
Добавь это в крон, через минуту у тебя появится 1 работающий процесс твоего скрипта.
Код: */1 * * * * root [ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/etc/pingwa/pingwa.sh >/dev/null 2>&1) >/dev/null 2>&1
[ "$(ps -aef | grep -c 'pingwa.sh')" -eq "1" ] && (/etc/pingwa/pingwa.sh) - это короткая запись проверки
if ps -aef | grep -c 'pingwa.sh' = 1 then
/etc/pingwa/pingwa.sh - запускаем твой скрипт
else exit.
Ну и убери проверку из скрипта.... -
Виталька писал :Добавь это в крон
Отличная идея, только вот немного изменить строку пришлось, а то с -eq 1 не канает, потому что (уж не знаю почему) насчитывает 3 строки по крону...
Переделал немного:
Код: */1 * * * * root [ $(ps -aef | grep -c pingwa.sh) -ge 4 ] || (/etc/pingwa/pingwa.sh 192.168.80.2&) &>/etc/pingwa/cron