1 2 3 4 5 6 7 8 9 10 11 12 13 |
SERVICES="modem2g" # можно указать через пробел несколько сервисов # проверка запущен ли сервис, если нет то запускаем ############################ for SERVICE in ${SERVICES} do service $SERVICE status 2 > &1 >/dev/null if [ $? -ne 0 ]; then service $SERVICE restart echo -e "Starting $SERVICE" else echo -e "$SERVICE OK" fi done |
Thank you for reading this post, don't forget to subscribe!
__________________________________
watchdog за модемом:
OS - CentOS 7
Modem - Huawei E3272
USB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/bin/bash SITE="ya.ru" #проверяемый ресурс IF="wwp6s0u2i1" #имя сетевого интерфейсв DEV="1-1" #шина и порт модема lsusb -t MM="Huawei" #маркер модема, можно заменить на "Huawei" или подобное из команды lsusb EP="3" #число ошибочных пингов M=`lsusb | grep $MM` #строка модема из lsusb if [ "$M" != "" ]; then #если модем выбран, можно проверять пинги echo "Делаем пинги…" flag="0" for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 14 -s 8 -c 1 -I $IF $SITE || flag=$(($flag+1)) && echo "пинг:$i/5 (ош.:$flag)" #пинг не прошел - инкрементируем счетчик if [ "$flag" -ge "$EP" ]; then break else sleep 1 fi done echo "потерь пакетов: $flag из $i" if [ "$flag" -ge "$EP" ]; then #если потерь пакетов больше 2х M=`lsusb | grep $MM` #на всякий случай снова глянем - вдруг модем выдернули echo "Будет сброшен модем:" echo $M ifdown $IF #деактивируем интерфейс sleep 1 echo $DEV > /sys/bus/usb/drivers/usb/unbind #выключаем питание модема sleep 1 echo $DEV > /sys/bus/usb/drivers/usb/bind #включаем питание модема sleep 2 ifup $IF #активируем интерфейс fi else echo "Модем [$MM] не найден." lsusb fi |
modem siemens mc35i
1 вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
cat watchdog-modem.sh #!/bin/bash SITE="8.8.8.8" #проверяемый ресурс IF="ppp0" #имя сетевого интерфейса EP="3" #число ошибочных пингов CHECK_NETWORK_INTERFACE=`cat /proc/net/dev | awk '{print $1}' | grep $IF | awk -F ':' '{print $1}'` #проверяем наличие сетевого интерфейса if [ "$CHECK_NETWORK_INTERFACE" != "" ]; then #если сетевой интерфейс есть, можно проверять пинги echo "Start ping…" flag="0" # обнуляем счётчик for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 14 -s 8 -c 1 -I $IF $SITE || flag=$(($flag+1)) && echo "PING:$i/5 (ERROR.:$flag)" #пинг не прошел - увеличиваем счетчик на 1 if [ "$flag" -ge "$EP" ]; then # данное условие тормозит цикл если счётчик flag становится больше 2х break else sleep 1 fi done echo "packets LOST: $flag from $i" if [ "$flag" -ge "$EP" ]; then #если потерь пакетов больше 2х (по счётчику flag") echo "error" >> /root/error_log_modem2g.log # то записываем в файл error num_error_in_log=`cat /root/error_log_modem2g.log | grep error | wc -l` #проверяем количество error в файле else echo "" > /root/error_log_modem2g.log #данное обнуление файла необходимо, если связь восстановилась num_error_in_log=`cat /root/error_log_modem2g.log | grep error | wc -l` fi else # если сетевого интерфейса нету, то пинги не проверяются, а сразу рестартуется сервис модема echo "network interfase is missinng" systemctl stop modem2g sleep 5 systemctl start modem2g echo "" > /root/error_log_modem2g.log fi if [ -n "$num_error_in_log" ]; #проверяем наличие переменной, определена она или нет then if [ "$num_error_in_log" -ge "$EP" ]; # если ошибок в файле error_log_modem2g.log больше 2х, рестартуем сервис modem2g then echo "Number of ERROR ping more than 2, becouse we restart service modem2g" systemctl stop modem2g sleep 5 systemctl start modem2g echo "" > /root/error_log_modem2g.log fi fi |
2 вариант который вроде попроще в понимании
что он делает:
1) проверяем запущен ли сервис modem2g, если нет, то запускаем и выходим из скрипта
2) проверяем наличие сетевого интерфейса, если его нет, то перезапускаем сервис и выходим из скрипта
3) если сервис запущен, сетевой интерфейс есть, то запускаем ping на запрашиваемый нами ресурс и если 3 из 5 проверок будут не успешными, сервис будет перезапущен.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#!/bin/bash SITE="8.8.8.8" #проверяемый ресурс IF="ppp0" #имя сетевого интерфейса EP="3" #число ошибочных пингов SERVICES="modem2g" # можно указать через пробел несколько сервисов CHECK_NETWORK_INTERFACE=`cat /proc/net/dev | awk '{print $1}' | grep $IF | awk -F ':' '{print $1}'` #проверяем наличие сетевого интерфейса # проверка запущен ли сервис, если нет то запускаем ############################ for SERVICE in ${SERVICES} do systemctl status $SERVICE 2>&1>/dev/null if [ $? -ne 0 ]; then systemctl restart $SERVICE echo -e "Starting $SERVICE" # рестарт сервиса и выход exit 1 else echo -e "$SERVICE OK" fi done # если сетевого интерфейса НЕТ ################################### if [ "$CHECK_NETWORK_INTERFACE" == "" ]; then # если сетевого интерфейса нету, то пинги не проверяются, а сразу рестартуется сервис модема echo "network interfase is missinng, service modem2g will be restart" systemctl stop modem2g sleep 5 systemctl start modem2g echo "" > /root/error_log_modem2g.log # рестарт интерфейса и выход exit 1 fi echo "Start ping…" flag="0" # обнуляем счётчик # PING Cycle START ################################################ for i in {1..5}; do #делаем 5 пингов до сервера timeout -k 2 -s TERM 16 ping -w 10 -s 8 -c 1 -I $IF $SITE || flag=$(($flag+1)) && echo "PING:$i/5 (ERROR.:$flag)" #пинг не прошел - увеличиваем счетчик на 1 if [ "$flag" -ge "$EP" ]; then # данное условие тормозит цикл если счётчик flag становится больше 2х break else sleep 1 fi done # Cycle END ################################################ # информационно сообщение ################################## echo "packets LOST: $flag from $i" # Check error number ####################################### if [ "$flag" -lt "$EP" ]; then echo "" > /root/error_log_modem2g.log # Количество потерь пакетов меньше 3, связь восстановилась или вообще не терялась, обнуление файла и выход exit 1 fi # добавляем error в лог файл ############################### echo "error" >> /root/error_log_modem2g.log # то записываем в файл error # подсчитываем количество error в лог файле ############################## num_error_in_log=`cat /root/error_log_modem2g.log | grep error | wc -l` # если ошибок в файле error_log_modem2g.log больше 2х, рестартуем сервис modem2g ############################## if [ "$num_error_in_log" -ge "$EP" ]; then echo "Number of ping ERROR more than 2, restart service modem2g" systemctl stop modem2g sleep 5 systemctl start modem2g # перезапускаем сервис и обнуляем лог файл ###################################### echo "" > /root/error_log_modem2g.log fi |
добавляем в cron:
crontab -l
* * * * * /bin/bash /root/watchdog-modem.sh