Jak utrzymać połączenie Wi-Fi po rozłączeniu?

9

Mam maszynę Ubuntu z oprogramowaniem wymagającym Internetu. Czasami jednak Wi-Fi nie działa (na przykład restart routera) i nie odnajduje sieci ponownie, dopóki ręcznie nie zrestartuję menedżera sieci lub nie wyłączy się i nie włączę Wi-Fi, aby go znaleźć.

Czy jest możliwy sposób uruchomienia zadania CRON lub zadania nadzorcy w celu monitorowania łączności i jeśli nie można znaleźć sieci, aby ponownie uruchomić usługę menedżera sieci i połączyć się z tym konkretnym identyfikatorem SSID?

Niebieski dżin
źródło
Myślę, że może to być spowodowane nowym błędem menedżera sieci, ponieważ problem ten zacząłem dopiero niedawno, myślę, że po aktualizacji do Ubuntu 15.04.
Sadi
1
Istnieje wiele raportów o błędach, które sugerują, że może występować problem. Czy możesz opublikować szczegóły dotyczące wersji jądra (uname -a) i wersji menedżera sieci, a także szczegóły dotyczące karty WiFi.
DaveM

Odpowiedzi:

7

Myślę, że może to być spowodowane nowym błędem menedżera sieci, ponieważ ten problem również zacząłem ostatnio - myślę, że po aktualizacji do Ubuntu 15.04.

Wygląda na to, że udało mi się tymczasowo rozwiązać ten problem jako obejście tych dwóch plików:

  1. Mam plik skryptu do oglądania połączenia Wi-Fi i włączania i wyłączania Wi-Fi po rozłączeniu, np. ~/.bin/WiFi-Keep-ConnectedZ tą zawartością:


#!/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. Mam również plik .desktop, aby ten skrypt działał przy każdym logowaniu, np. ~/.config/autostart/KeepWifiConnected.desktopZ tą zawartością:


[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

Uwaga: musisz wpisać swoją nazwę użytkownika w ścieżce podanej Exec=powyżej.

Uwaga: czasami ponowne uruchomienie Wi-Fi w ten sposób nie wystarczy, w takim przypadku muszę ponownie uruchomić Menedżera sieci , wprowadzając to polecenie raz lub nawet dwa razy z terminala:sudo service network-manager restart

Dlatego lepszym pomysłem może być zmodyfikowanie powyższego skryptu (na wszelki wypadek) w następujący sposób:


#!/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

Sadi
źródło
1

Nie wiem dlaczego, ale jak wspominasz, czasami, gdy Wi-Fi zawiedzie, menedżer sieci nie znajdzie sieci ponownie.

Myślę, że problem polega na tym, że menedżer sieci po awarii połączenia Wi-Fi nie odświeża listy Wi-Fi (i wygląda na to, że menedżer sieci ukrywa problematyczną sieć). Menedżer sieci nie ma opcji menu ponownego skanowania, a wyłączenie i włączenie pola wyboru sieci bezprzewodowej w menu menedżera sieci nie wymusza nowego skanowania Wi-Fi (podobnie jak w przypadku ponownego uruchomienia usługi).

Gdy menedżer sieci utraci połączenie przewodowe i nie znajdzie ponownie mojego Wi-Fi (i wiedziałem, że Wi-Fi działa), wykonuję polecenie:

sudo iwlist wlan0 scan

Wykonuje skanowanie Wi-Fi na interfejsie wlan0 (wlan0 to nazwa interfejsu bezprzewodowego w moim laptopie) i pokazuje dostępne sieci bezprzewodowe, ale jako efekt uboczny menedżer sieci automatycznie odświeża swoją listę i znajduje utraconą sieć.

Wolę wykonać polecenie ręcznie, gdy wystąpi ten problem (ponowne połączenie sieciowe nie zapewnia wznowienia komunikacji, a niektóre programy będą musiały zostać ponownie uruchomione).

Ale, jak wspomniałeś, możesz to zrobić i możesz to zrobić bez testowania łączności (proces skanowania aktualizuje listę Wi-Fi, ale nie zamyka twojego obecnego połączenia bezprzewodowego, jeśli jesteś podłączony).

Jeśli wolisz, możesz przetestować łączność za pomocą polecenia ping lub iwconfig, a jeśli nie masz połączenia, uruchom skanowanie.

Coś jak:

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

Pamiętaj jednak, że ten skrypt musi być sudo lub wykonany z uprawnieniami administratora. Wysyła tylko 1 ping z 1 sekundowym limitem czasu.

acesargl
źródło
Powyższe rozwiązanie jest w porządku, ale jak złapać powiadomienie od menedżera sieci (nm), że połączenie zostało przerwane. Powinno to być możliwe z samego nm, wydaje się, że szybkie spojrzenie na źródło sugeruje funkcjonalność. Wiadomość jest pobierana z dbus, a ikona nm aktualizuje się, więc może to jest błąd, a może inna część systemu łapie przerwanie połączenia i została zmodyfikowana, a powiadomienie nie przechodzi przez próbę ponownego połączenia?
DaveM
0

Myślę, że problem polega na tym, że połączenie zostaje utracone z powodu problemów z łącznością routera. Ponowne uruchomienie menedżera sieci nie może pomóc, gdy sam router ma problemy. Zamiast tego możesz utworzyć skrypt, aby zawiesić proces uruchamiania oprogramowania za pomocą SIGSTOP, gdy połączenie zostanie utracone, i ponownie uruchomić proces kontynuowania używania SIGCONT, gdy sieć stanie się dostępna. I dodaj skrypt do zadań crona, planując jego uruchamianie co minutę.

W celach informacyjnych: http://hints.macworld.com/article.php?story=20030915193440334

Mam nadzieję że to pomoże.

Wirtualne podróże
źródło