Как сохранить соединение Wi-Fi после отключения?

У меня на машине с Ubuntu работает программное обеспечение, требующее интернета. Тем не менее, иногда происходит сбой Wi-Fi (например, перезагрузка маршрутизатора) и он не находит сеть снова, пока я не перезапущу диспетчер сети вручную или не выключу и не включу Wi-Fi, чтобы найти его.

Есть ли возможный способ запустить задание cron или задание supervisord для контроля подключения, и если не удается найти сеть, чтобы перезапустить службу администратора сети и подключиться к этому конкретному SSID?

3 ответа

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

Кажется, мне удалось временно решить эту проблему как обходной путь с этими двумя файлами:

  1. У меня есть файл сценария для наблюдения за соединением WiFi и включения и выключения WiFi при отключении, например ~/.bin/WiFi-Keep-Connected с этим содержанием:


#!/bin/bash
while true; do
    LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
    if [ $? -eq 0 ]; then
        rfkill block wifi && rfkill unblock wifi
        sleep 10
    fi
    sleep 10
done

  1. У меня также есть файл.desktop, чтобы этот скрипт работал каждый раз, когда я вхожу в систему, например ~/.config/autostart/KeepWifiConnected.desktop с этим содержанием:


[Desktop Entry]
Type=Application
Exec=/home/"username"/.bin/WiFi-Keep-Connected
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Keep WiFi Connected
Icon=networkmanager

Примечание. Вам необходимо ввести имя пользователя в пути, указанном для Exec= выше.

NB. Иногда такого перезапуска Wi-Fi недостаточно, и в этом случае мне нужно перезапустить Network Manager, введя эту команду один или даже два раза с терминала: sudo service network-manager restart

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


#!/bin/bash
while true; do
    LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
    if [ $? -eq 0 ]; then
        rfkill block wifi && rfkill unblock wifi
        sleep 10
    fi
    LC_ALL=C nmcli -t -f TYPE,STATE dev | grep "^wifi:disconnected$"
    if [ $? -eq 0 ]; then
        gksudo service network-manager restart
        sleep 10
    fi
    sleep 10
done

Я не знаю почему, но, как вы упомянули, иногда, когда отказывает Wi-Fi, сетевой менеджер снова не находит сеть.

Я думаю, что проблема в том, что сетевой администратор после сбоя соединения Wi-Fi не обновляет список Wi-Fi (и кажется, что сетевой менеджер скрывает проблемную сеть). Диспетчер сети не имеет опции меню повторного сканирования, а отключение и включение беспроводного флажка в меню диспетчера сети не вызывает новое сканирование Wi-Fi (как при перезапуске службы).

Когда администратор сети теряет соединение с Wireles и снова не находит мой wifi (и я знаю, что wifi работает), я выполняю команду:

sudo iwlist wlan0 scan

Он выполняет сканирование Wi-Fi на интерфейсе wlan0 (wlan0 - это название беспроводного интерфейса в моем ноутбуке) и показывает доступные беспроводные сети, но в качестве побочного эффекта сетевой менеджер автоматически обновляет свой список и находит потерянную сеть.

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

Но, как вы упоминаете, вы можете справиться с этим, и вы можете сделать это без проверки подключения (процесс сканирования обновляет ваш список Wi-Fi, но он не закрывает ваше текущее беспроводное соединение, если вы подключены).

Если вы предпочитаете, вы можете проверить связь с помощью ping или iwconfig, а если вы не подключены, запустить сканирование.

Что-то вроде:

#!/bin/bash
if ! ping -c 1 -W 1 your_router_ip &> /dev/null
then
    iwlist wlan0 scan
fi

Но помните, что этот скрипт должен быть sudoed или выполнен с привилегиями root. Он отправляет только 1 пинг с тайм-аутом 1 секунда.

Я думаю, что проблема в том, что соединение теряется из-за проблем с подключением маршрутизатора. Перезапуск диспетчера сети не может помочь, когда у самого маршрутизатора возникают проблемы. Скорее вы могли бы создать сценарий, чтобы заставить процесс, выполняющий программное обеспечение, приостанавливать использование SIGSTOP, когда соединение теряется, и снова запускать процесс, чтобы продолжать использовать SIGCONT, когда сеть станет доступной. И добавьте скрипт в ваши задания cron, планируя его запуск каждую минуту.

Для справки: http://hints.macworld.com/article.php?story=20030915193440334

Надеюсь это поможет.

Другие вопросы по тегам