Debian.pro/

Про Debian


Linux. Заставляем систему что-то делать при потере пинга. Перезапуск сети при отсутствии пинга.

Набросал на днях простенький скрипт, которые перезапускает сеть при потере пинга.

Тем, кому нужно — поймут как подправить. Пишу в файл специально из некоторых соображений, которые были продиктованы изначальной задачей.


#!/bin/bash
ping -c 3 www.ru > /root/ping
a=$(cat /root/ping | tail -n2 | head -n1 | awk {'print $6'} | sed s/%//)
echo $a
if [ $a != 0 ]
then date > /root/fail && ifdown eth0 && sleep 2 && ifup eth0
fi
echo T

При потере пакетов, отличной от нуля — сервер делает пометку в /root/fail, делает ifdown eth0, ждёт 2 секунды и делает ifup eth0.

При необходимости — поменяйте строку then date > /root/fail && ifdown eth0 && sleep 2 && ifup eth0. Например на pon/poff

Запускать в screen, само собой (или в локальной консоли, если туда есть доступ). Будьте внимательны при остановке скрипта.

запускать так:
while [ 1 ]; do ./root/ping.sh; echo pause; sleep 2; echo script; done

echo pause; sleep 2; echo script; — для того, чтобы не стопнуть скрипт во время его выполнения.

UPD:
Более прогрессивная версия +)

#!/bin/bash
doping () {
ping -c 3 8.8.8.8 > /dev/null
}

dook () {
#what to do if ping ok?
echo "ping ok"
}

doerror () {
# what to do if ping failed?
echo "error"
echo "$(date) ping failed! i am restarting network" >> /var/log/network-fail.log
}

doping && dook || doerror
# this is the end of script.


Комментарии (20):

  1. selivan :

    Чтобы не мучаться с разбором вывода ping, есть такая прекрасная вещь как fping, позволяющая судить о доступности хоста по exit code.

  2. Хм. Некропост.
    Да, я уже тоже давно по $? смотрю. Перепишу.

  3. pessom :

    Самый простой и безотказный скрипт, не советую пинговать хосты, т.к. могут лежать ДНС сервера, а при этой проблеме рестарт инета не поожет

    if ping -c 4 8.8.8.8 >> /dev/null
    then
    echo «Internet is connected»
    exit 0
    else
    /etc/init.d/networking restart
    echo «Restart internet»
    fi

  4. Скрипт устарел уже, в общем то (относительно того, что я сейчас умею). Так что перепишу на досуге.

  5. ASpr :

    :) интересно конечно, но смысл «>>» в строчке «if ping -c 4 8.8.8.8 >> /dev/null» мне мало понятен … зачем добавлять в null??? может апичатка :)

  6. k4m454k :

    ASpr, чтобы в консоль выводом не срало.

  7. zxc :

    В функции doerror () не стоит закрывающей скобки ‘}’. Но спасибо.

  8. Спасибо, поправил.

  9. VIOLblade :

    Когда инициал зримую скрипт, пишет- отказано в доступе. Может из др. Папки выполнять?

  10. Влад :

    chmod +x на скрипт скажите.

  11. Михаил :

    Я только не понял, в новом скрипте он же сеть не трогает а просто лог пишет «Я рестартнул сеть». Там ведь команды нет, как в первом.

  12. Михаил :

    и как 2 и 3 функция определяет результат из первой? между ними видимой связи нету. В конце выполняеться первая функция и (вторая или третяя). Чтото я не врубаю))

  13. > Я только не понял, в новом скрипте он же сеть не трогает а просто лог пишет «Я рестартнул сеть». Там ведь команды нет, как в первом.
    Дык напиши, сеть у всех по-разному поднимается.

    > и как 2 и 3 функция определяет результат из первой? между ними видимой связи нету. В конце выполняеться первая функция и (вторая или третяя). Чтото я не врубаю))

    Это логические операторы. && — выполнять что-то, если предыдущее завершилось успешно, || выполнять что-то, если завершилось с exit code отличным от нуля:
    inkvizitor68sl@isera:~$ true && echo ok || echo fail
    ok
    inkvizitor68sl@isera:~$ false && echo ok || echo fail
    fail

  14. Михаил :

    Спасибо, доходчиво)

  15. Nik :

    Абсолютно не работоспособные скрипты. Ни один. Даже не стоит пробовать запускать, писал школьник не понимающий, что пишет.

  16. Что, скопипастили, не прочитали статью, не заработало?
    Конструктив будет?

  17. После изменения скрипта под свои нужды всё отлично заработало, спасибо автору :)

  18. ele :

    Спасибо! Помогло!!! Люди, включайте мозги при использовании подсказок!
    Машины должны работать. Люди должны думать! (с)

  19. петр :

    поясните пож последнюю строку

    doping && dook || doerror

    это условие в 1 строку, или как это понимать?

  20. inkvizitor68sl :

    > это условие в 1 строку, или как это понимать?
    Не совсем, но близко к тому. Логика работы немного другая всё же — если dook вернет ошибку, то doerror тоже выполнится, в отличие от if doping; then dook; else doerror; done — здесь на код возврата dook никто уже смотреть не будет.

Написать комментарий