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


9

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

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


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

1
Есть ряд сообщений об ошибках, которые предполагают, что могут быть проблемы. Не могли бы вы опубликовать информацию о вашем ядре (uname -a) и версии сетевого менеджера, а также информацию о вашей WiFi-карте.
DaveM

Ответы:


7

Я думаю, что это может быть связано с новой ошибкой сетевого менеджера, поскольку я также начал испытывать эту проблему только недавно - думаю, после обновления до 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


1

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

Я думаю, что проблема в том, что сетевой администратор после сбоя соединения 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 секунда.


Приведенное выше решение хорошо, но как поймать уведомление от сетевого администратора (nm), что соединение оборвалось. Это должно быть возможно изнутри самого нм, при быстром взгляде на источник можно предположить, что функциональность есть. Сообщение взято из dbus, и значок nm обновляется, поэтому, возможно, это ошибка, или, возможно, другая часть системы перехватывает соединение и была изменена, и уведомление больше не проходит, чтобы попытаться восстановить соединение?
DaveM

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.