4

Я пытаюсь написать небольшой скрипт bash, который проверяет подключение к интернету. Если Интернет не обнаружен, он повторяет попытку через 10 минут ... и, если Интернет по-прежнему отсутствует, он перезагружает компьютер. Я написал это до сих пор. Любые идеи, чтобы предложить улучшение / эффективность / лучший код приветствуется.

#!/bin/bash
# Script to restart the computer if there is no internet connection 
#   within the next 10 minutes of whenever the script is run, which 
#   I'll setup via crontab to run every half an hour. 

IS=`/bin/ping -c 5 8.8.8.8 | grep -c "64 bytes"`        

if (test "$IS" -gt "2") then                                
        internet_conn="1"
    exit
else
    internet_conn="0"
    sleep 600

    AA=`/bin/ping -c 5 74.125.226.18 | grep -c "64 bytes"`

    if (test "$AA" -gt "2") then                                
        internet_conn="1"
        exit
    else
        sudo shutdown -r now
    fi
fi

5 ответов5

2

Я думаю, что ваш скрипт должен работать нормально, но вы можете проверить больше мест, чем один DNS-сервер. Конечно, это большой DNS, который, вероятно, никогда не выйдет из строя, но вы не хотите перезагружать ваш сервер, если они выполняют техническое обслуживание на этом IP, поэтому я бы проверил, может быть, три источника, и если все они показывают как отключенные, перезапустите сервер.

Кроме того, может быть более разумным будет просто отключить интерфейс и выполнить резервное копирование, а не перезагрузить компьютер?

1

Небольшое предложение, вам не нужен grep для оценки успешности пинга. Пинг завершается с 0, если успешно, и 1 или выше, если произошла ошибка. Таким образом, вы также можете написать это следующим образом. $? Переменная показывает код возврата последней выполненной команды.

/bin/ping -c 5 8.8.8.8

if ( $? -ge 1); then
 ......
fi
0

Ваш комментарий об обратном ssh-туннеле через некоторое время, вероятно, связан с тем, что маршрутизатор NAT пытается слишком минимизировать свою таблицу открытых соединений и должен быть разрешен с помощью директивы ServerAliveInterval, как описано в FAQ по OpenSSH.

В некоторых случаях маршрутизатор / брандмауэр все равно агрессивно сокращает ваши сеансы (плохо!) когда ссылка долгое время простаивает, что заставляет вас понизить ServerAliveInterval (см. примечание).

Хитрость в этом случае заключается в том, чтобы использовать своего рода оболочку, отслеживающую демон ssh и перезапускающую его при необходимости, autossh делает именно это, что должно решить вашу проблему прямо сейчас!


примечание : это то, что вы хотите ограничить, потому что увеличение частоты пакетов keepalive на нестабильном канале повышает риск разрыва соединения; которые определяются как x пакетов ответа keepalive, в действительности пакеты TCP ACK терпели неудачу последовательно.

Если ваша ссылка надежна, не стесняйтесь понизить эту директиву для вашего удобства (будьте осторожны, вам не требуется пакет поддержки активности в секунду) для более быстрого обнаружения отключений от сервера.


PS: Чтобы объяснить мой комментарий по этому вопросу, меня немного отталкивает идея использования ping в качестве условия для перезапуска службы и ее использования на сервере, которым вы не владеете и, следовательно, не можете гарантировать доступность, возможно. завтра Google решит перестать отвечать на эхо-запросы, и ваш сервер будет перезагружаться бесконечно.

Другой проблемой является то, что вы определяете как "подключение к Интернету", так как по определению большая коллекция сетей и тестирование одной конечной точки могут быть слишком малы, чтобы понять ваше подключение к сети, поэтому службы мониторинга в Интернете используют различные ссылок для отслеживания времени отклика / времени работы / т. д.

0

Вот подход, который использует at чтобы перепланировать себя через 10 минут, чтобы проверить снова.

#!/bin/bash
count=${1:-1}
if /bin/ping -c 5 8.8.8.8 2>&/dev/null; then                                
    if [ $count -eq 2 ]; then
        sudo shutdown -r now
    else
        at now + 10 minutes <<< "$0 $((count + 1))"
    fi
fi
0

Этот ответ для тех, кто придет в 2019 году и выше:

Я пытался использовать ответ @rkokkelk, но, похоже, он не работает, и документация bash подтверждает это предположение, если я правильно прочитал.

Поэтому я представляю вам мой личный подход (я знаю, что он неэффективен, но я хотел этого):

#!/bin/bash
# Restarts computer after 90 minutes of no internet connection.

/bin/ping -c 20 8.8.8.8

if [ "$(echo $?)" == 1 ]; then
    sleep 15
    /bin/ping -c 20 8.8.4.4

    if [ "$(echo $?)" == 1 ]; then
        sleep 5400

        /bin/ping -c 20 8.8.8.8

        if [ "$(echo $?)" == 1 ]; then
            sleep 15
            /bin/ping -c 20 8.8.4.4

            if [ "$(echo $?)" == 1 ]; then
                shutdown -r now
            else
                exit
            fi
        else
            exit
        fi
    else
        exit
    fi

else
    exit
fi

Это работает с bash version 4.4.12(1)-release .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .