Ich habe ein Problem. Eigentlich 2 Probleme.
1) Mein Laptop hat eine ziemlich zickige WLAN-Karte (rtl8723be), welche immer wieder einmal die WLAN-Verbindung verliert.
2) In meiner Wohnung sind offenbar so viele WLAN-APs in der Umgebung, oder das Modem meines Kabelanbieters ist so schrottig, dass die WLAN-Verbindung immer wieder einmal abbricht.
Ersteres kann ich auch in anderen WLANs (Büro, Internetcafe) nachvollziehen
Zweiteres kann ich auch mit anderen Geräten (Handy, anderer Laptop) nachvollziehen.
In Kombination ist es also ein echter Graus.
Am Laptop äußert sich das Problem so, dass zwar nachwievor eine IP-Adresse vorhanden ist, sowie auch die Routen gesetzt sind, aber kein Ping mehr rauskommt (Weder zum Router noch weiter ins Internet rein...). Da hilft meist ein Neustart des NetworkManagers, und dann geht es wieder eine Zeit.
Einerseits ist das lästig, wenn ich am Rechner arbeite und viel im Internet herumsuche. Andererseits ist das sehr sehr störend, wenn ich von außen (z.B. Büro) auf meinen Rechner daheim zugreifen möchte, und dann geht nix mehr übers WLAN...
Eine Lösung, den Rechner mittels LAN an den Router zu hängen erfordert einigen baulichen Aufwand, und kommt später (oder nie...)
Jetzt hab ich mir eine systemd-Unit geschrieben, die mir google jede Minute anpingt und den NetworkManager neu startet, falls der Ping nicht erfolgreich ist.
Als Randbedingung für diesen Service mit Timer ist, dass das target network-online aktiv sein muss.
Dazu hab ich mir noch ein Skript in den dispatcher des NetworkManagers geworfen, welches network-online.target stoppt, falls der NetworkManager eine Verbindung beendet...
Das heißt, der Timer meiner network-check-Unit wird mit dem network-online.target sowohl gestartet als auch gestoppt.
network-online.target wird mit den Verbindungen des NetworkManagers gestartet und gestoppt.
Die Prüfung, ob die Verbindung noch funktioniert wird also nur dann ausgeführt, wenn wirklich eine aktive Netzwerkverbindung lt. NetworkManager vorhanden sein sollte.
Hier die entsprechenden Units und Skripte:
Dieses Skript prüft bei jeder Aktivität des NetworkManagers, ob noch eine Verbindung aktiv ist und startet oder stoppt entsprechend die systemd-unit network-online.target
Code: Alles auswählen
# cat /etc/NetworkManager/dispatcher.d/network-online.sh
#!/bin/bash
if /usr/bin/nm-online --timeout 3; then
/bin/systemctl start network-online.target
else
/bin/systemctl stop network-online.target
fi
exit 0
Code: Alles auswählen
/etc/systemd/system: # cat network-check.timer
[Unit]
Description=Runs network-check every minute
PartOf=network-online.target
[Timer]
OnCalendar=*:0/1
[Install]
WantedBy=network-online.target
Code: Alles auswählen
/etc/systemd/system: # cat network-check.service
[Unit]
Description=Restarts NetworkManager.service, when network-connection is broken (bad WLAN...)
[Service]
ExecStart=/bin/sh -c "/bin/ping -q -c 1 www.google.com > /dev/null; if test $? -ge 1;then /bin/systemctl restart NetworkManager.service ;fi"
[Install]
WantedBy=network-check.target
Code: Alles auswählen
systemctl enable network-check.timer
Man kann mit
Code: Alles auswählen
systemctl status network-check.timer
Code: Alles auswählen
systemctl list-timers
Hat jemand zu dieser Lösung eine bessere Idee? Was kann man noch verbessern? Was kann man anders machen?
Btw. Vorschläge wie "Wlan will man nicht" oder "Leg doch ein LAN-Kabel", oder "google ist böse" sind nicht zielführend, und entsprechen nicht meiner Frage.
Ich kauf mir auch keinen WLAN-Dongle der weniger zickt, und ich bin mir bewusst, dass ich vor dem Kauf des Laptops besser hätte recherchieren können, ob die WLAN-Karte von Linux gut unterstützt wird... Die Rahmenbedingungen sind jetzt so und können in absehbarer Zeit nicht geändert werden.
Und ja, auch systemd ist hier im Einsatz. Auch wenn es für manche böse ist.
![Smile :)](./images/smilies/icon_smile.gif)
lg scientific