Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

In diesem Artikel wird ein Skript beschrieben, um bei WLAN-Verbindungsproblemen unter Ubuntu die Prozesspriorität von wpa_supplicant, des DHCP-Clients und des verwendeten Managers automatisch anzupassen. Das Problem tritt meist bei mit Windows WLAN-Treibern in Verbindung mit NdisWrapper auf.
Beim Aufbau einer WLAN-Verbindung wird wegen einer zu hohen Prozesspriorität von wpa_supplicant, des verwendeten Managers und NdisWrapper oftmals keine IP-Adresse vom Router zugewiesen. Während des Verbindungsaufbaus kann die Priorität der Prozesse geändert werden. Der Effekt muss nicht auftreten und ist auch von der Rechenleistung des Systems und der Anzahl weiterer Systemprozesse abhängig.
Bei einer klassischen Konfiguration über die Datei interfaces kann die Priorität durch den direkten Aufruf von wpa_supplicant eingestellt werden. Hinweise dazu in folgendem Forenbeitrag
Merkmale des Skripts:
Speziell angepasste Versionen für den Network-Manager und Wicd. Für Wicd gibt es alternativ auch einen Patch
Erkennung und Überwachung der LAN-Schnittstelle
Überwachung der Verbindung über ping (abschaltbar) und der IP-Adresse (LAN und WLAN)
Debug-Modus
Erweiterte Protokollierung der Ereignisse
Prozesspriorität bei laufendem Verbindungsversuch im Terminal [1] ändern. Siehe dazu auch Shell/nice.
sudo renice +19 $(pidof wpa_supplicant)
Funktioniert nun der Verbindungsaufbau, liegt es an einer zu hohen Prozesspriorität. Je nach verwendetem Manager die benötigte Skript-Version auswählen, das Skript erstellen und zuerst im Debug-Modus starten um die optimalen Werte der Zeitgeber für den Verbindungsaufbau zu ermitteln. Die Werte sind auch von der Rechenleistung des Systems abhängig und die Vorgabewerte des Skripts sind ggf. anzupassen.
Mit einem Editor [2] erzeugt man eine leere Datei und kopiert den zum verwendeten Manager passenden Code des des unter Versionen aufgezeigten Skriptes hinein und speichert unter entsprechendem Dateinamen ab. Anschließend muss das Skript noch ausführbar gemacht werden [4].
Im folgenden Abschnitt am Anfang des Skripts können verschieden Einstellungen festgelegt werden.
### Variablen ### Zeiten für die Loops und Wartezeiten in Sekunden - Werte ggf. anpassen ...
Entsprechende Hinweistexte stehen vor dem entsprechenden Parameter. Vorab sind einige Einstellungen für die verwendeten Schnittstellen und IP-Adressen für den Verbindungstest zu überprüfen und an das eigene System anzupassen. Ab Ubuntu 9.10 Karmic Koala ist es erforderlich die Priorität einzelner Prozesse individuell anzupassen. Beachte die Erläuterungen und Vorgabewerte im Konfigurationsblock des Skripts.
Name der vorhandenen LAN-Schnittstelle
### LAN-Verbindung prüfen LAN_Interface="eth0"
Name der WLAN-Schnittstelle:
### WLAN_Interface = Schnittstelle ggf. anpassen WLAN_Interface="wlan0"
IP-Adresse des eigenen Routers oder Gateways:
### IP-Adresse die angepingt werden soll (nur 1 Ping) ### IP-des Routers, Gateways oder Adresse (z.B. google.de) eintragen pingip="192.168.178.1"
Einstellungen der Zeitgeber:
### Überwachungsintervall wenn LAN-Verbindung als aktiv erkannt wurde slow_Loop_LAN=120 ## Wartezeit vor renice bis wpa_supplicant sicher gestartet ist (0-4) wait_to_renice_wpa=0 ## Prozessüberwachung bevor wpa_supplicant gestartet ist (4-6) fast_Loop=4 ## Prozessüberwachung nachdem die Prozesspriorität von wpa_supplicant geändert wurde ## diese Zeit in Sek. steht auch dem Manager zur Verfügung eine Verbindung herzustellen ## Intervall für die Überwachung der WLAN-Verbindung slow_Loop=65
Für Wicd können zusätzlich die Werte für den verwendeten DHCP-Client eingestellt werden:
## Wartezeit vor renice bis der DHCP-Client sicher gestartet ist (2-6) wait_to_renice_client=3 ### Wert für Prozesspriorität DHCP-Client - Wert ggf. anpassen prcprio_client=19 ### DHCP-Client (dhclient)(default), (dhpcpd) (pump) client="dhclient"
Allgemeine Optionen:
### ndiswrapper wird verwendet ja(1) default, nein(0) ### kann bei Verwendung des Network-Managers die Stabilität der Verbindung verbessern ndiswrapper=1 ### Prozesspriorität für ndiswrapper (-20 bis +19) ### ubuntu 8.04 -9.04: +19 ### ubuntu 9.10: -12 bis -6 (-8 default) prio_ndis=-8 ### ping-Check aktiv (1) (default) / abgeschaltet (0) ### zusätzliche Überwachung der Verbindung über ping pingcheck=1 ### Namen und Pfade der Protokolldateien ggf. anpassen LogFile="prcprio.log" ### LOG sichtbar(1) (default) - Log versteckt(0) logvisible=1
Ab Version 0.2.1c kann die Priorität der einzelnen Prozesse individuell angepasst und aktiviert bzw. deaktiviert werden. Ab ubuntu 9.10 ist es nicht ganz einfach die passenden Einstellungen zu ermitteln.
Zum testen und ermitteln der optimalen Zeiten der internen Zeitgeber das Skript zuerst über Terminal [1][3] im Debugmodus starten:
sudo ./prcprio_wicd.sh -d # bei der Version für Wicd sudo ./prcprio_NM.sh -d # bei der Version für den Network-Manager
Im Terminal werden nun alle Hinweistexte angezeigt. Das Programm kann mit Strg + C abgebrochen werden um die Parameter für die Zeitgeber bei Bedarf anzupassen. Anschließend das Skript neu starten und wieder einen Verbindungsaufbau mit dem Manager probieren. Zusätzliche Informationen werden im erzeugten Logbuch angezeigt (prcprio.log).
Typische Ausgabe de Debugmeldungen im Terminal:
:~$ sudo ./prcprio_v021_NM.sh -d prcprio Debug-Mode aktiviert Loop:1 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0 Phase 0 - wpa_s-PID:2859 - Message: startup Ping: waiting for ping - WLAN ip-unknown - LAN ip-unknown Loop:2 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0 Phase 1 - wpa_s-PID:2859 - Message: waiting for PID Ping: waiting for ping - WLAN ip-unknown - LAN ip-unknown Loop:3 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0 Phase 2 - wpa_s-PID:2859 - Message: wait to renice Ping: waiting for ping - WLAN ip-unknown - LAN ip-unknown Loop:4 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0 Phase 3 - wpa_s-PID:2859 - Message: renice Process - Looptimer: 65 s Ping: waiting for ping - WLAN ip-unknown - LAN ip-unknown Loop:5 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0 Phase 3 - wpa_s-PID:2859 - Message: doing normal Loop - Looptimer: 65 s Ping: 0% packet loss - WLAN ip-addr:192.168.178.20 - LAN ip-unknown ...
In der ersten Zeile wird die Anzahl der durchlaufenen Programmschleifen (Loop) und die eingestellten Werte der einzelnen Zeitgeber (Timer) angezeigt.
Loop:1 Timer: fast:4 slow-WLAN:65 slow-LAN:120 wait wpa:0
In der zweiten Zeile werden der Fortschritt (Phase), die erkannte Prozess-ID von wpa_supplicant, die momentan verwendeten Zeitwerte für die Programmschleife und weitere Meldungen zu den ausgelösten Aktionen des Skripts angezeigt.
Phase 2 - wpa_s-PID:2859 - Message: wait to renice
In der dritten Zeile stehen Rückmeldungen des Verbindungstests und die IP-Adressen der verwendeten Schnittstellen:
Ping: waiting for ping - WLAN ip-unknown - LAN ip-unknown
Bei bestehenden WLAN-Verbindung:
Ping: 0% packet loss - WLAN ip-addr:192.168.178.20 - LAN ip-unknown
Bei bestehenden LAN-Verbindung:
Phase 3 - wpa_s-PID:5286 - Message: LAN-IP detected Loop 120 s - clear LAN-IP Buffer - check at next Loop Ping: 0% packet loss - WLAN ip-Dummy - LAN ip-addr:192.168.178.41
Typischer Inhalt der Logbuchdatei prcprio.log:
prcprio V0.2 für Network-Manager 2009 by Elektronenblitz63 published under GPL v3 Fr 4. Sep 11:02:28 CEST 2009 Programmstart Ändere die Priorität von Ndiswrapper (ndis_wq/wrapndis_wq) und Network-Manager 3611: Alte Priorität: 0, neue Priorität: 19 3612: Alte Priorität: 0, neue Priorität: 19 2855: Alte Priorität: 0, neue Priorität: 19 Phase 0 - starte Loop - 4 Sek. - warte auf wpa_supplicant Phase 1 - wait to renice Prozess Nr:2859 (wpa_supplicant) 2859: Alte Priorität: 0, neue Priorität: 19 Phase 2 - Priorität Prozess Nr:2859=19 (wpa_supplicant) geändert. Phase 3 - Loop 65 Sek. - starte Schnittstellenüberwachung Fr 4. Sep 11:03:36 CEST 2009 - WLAN ip-addr:192.168.178.20 - prüfe Verbindung: ping to ip-192.168.178.1 - waiting for ping Fr 4. Sep 11:04:45 CEST 2009 - WLAN ip-addr:192.168.178.20 - prüfe Verbindung: ping to ip-192.168.178.1 - 0% packet loss Fr 4. Sep 11:05:55 CEST 2009 - WLAN ip-addr:192.168.178.20 - prüfe Verbindung: ping to ip-192.168.178.1 - 0% packet loss Fr 4. Sep 11:07:04 CEST 2009 - WLAN ip-addr:192.168.178.20 - prüfe Verbindung: ping to ip-192.168.178.1 - 0% packet loss Fr 4. Sep 11:07:16 CEST 2009 kann Host nicht pingen - kill wpa_supplicant Phase 0 - Prozess beendet - unknown - Loop 4 Sek. - warte auf wpa_supplicant Phase 1 - wait to renice Prozess Nr:4907 (wpa_supplicant) 4907: Alte Priorität: 0, neue Priorität: 19 Phase 2 - Priorität Prozess Nr:4907=19 (wpa_supplicant) geändert. Phase 3 - Loop 65 Sek. - starte Schnittstellenüberwachung Fr 4. Sep 11:08:25 CEST 2009 - WLAN ip- - prüfe Verbindung: ping to ip-192.168.178.1 - waiting for ping Fr 4. Sep 11:08:27 CEST 2009 keine IP-Adresse LAN/WLAN-Interface - kill wpa_supplicant Phase 0 - Prozess beendet - WLAN-IP: unknown - Loop 4 Sek. - warte auf wpa_supplicant Phase 1 - wait to renice Prozess Nr:4966 (wpa_supplicant) 4966: Alte Priorität: 0, neue Priorität: 19 Phase 2 - Priorität Prozess Nr:4966=19 (wpa_supplicant) geändert. Phase 3 - Loop 65 Sek. - starte Schnittstellenüberwachung Fr 4. Sep 11:09:36 CEST 2009 - LAN/WLAN ip- - prüfe Verbindung: ping to ip-192.168.178.1 - waiting for ping Fr 4. Sep 11:10:45 CEST 2009 - LAN/WLAN ip-addr:192.168.178.20 - prüfe Verbindung: ping to ip-192.168.178.1 - 0% packet loss Fr 4. Sep 11:10:57 CEST 2009 kann Host nicht pingen - kill wpa_supplicant Phase 0 - Prozess beendet - unknown - Loop 4 Sek. - warte auf wpa_supplicant Phase 1 - wait to renice Prozess Nr:5286 (wpa_supplicant) 5286: Alte Priorität: 0, neue Priorität: 19 Phase 2 - Priorität Prozess Nr:5286=19 (wpa_supplicant) geändert. Phase 3 - Loop 65 Sek. - starte Schnittstellenüberwachung Fr 4. Sep 11:12:07 CEST 2009 - LAN/WLAN ip-addr:192.168.178.41 - prüfe Verbindung: ping to ip-192.168.178.1 - waiting for ping LAN aktiv - Intervalltimer auf 120
Das Skript für den Network-Manager wurde gestartet, die Prozesspriorität für die laufenden Prozesse wurden geändert und eine WLAN-Verbindung konnte aufgebaut werden. Im laufenden Betrieb wurde ein Verbindungsabbruch provoziert, erneut verbunden und anschließend von WLAN auf LAN umgeschaltet.
Funktioniert alles wie gewünscht, wird das Skript überlicherweise unter /opt abgelegt, wenn mehrere Benutzer die Funktion nutzen wollen oder müssen.
sudo cp prcprio_wicd.sh /opt # bei der Version für Wicd sudo cp prcprio_NM.sh /opt # bei der Version für den Network-Manager
Funktioniert alles, kann ein Eintrag für das Script in rc.local angelegt werden um es automatisch zu starten.
cd /opt ./prcprio_wicd.sh exit 0
Bei Verwendung des Network-Managers lautet der Eintrag entsprechend:
cd /opt ./prcprio_NM.sh exit 0
Alternativ kann das Skript auch nach /sbin kopiert und über die Autostart-Funktion aktiviert werden.
Skriptversion 0.2.1c für den Network-Manager (prcprio_NM.sh):
#!/bin/bash
## prcprio.sh V0.2.1c by Elektronenblitz63 (UbuntuUsers.de) 2009
## Version for Network-Manager
## elektronenblitz63@online.de
## published under GPL v3
##
## Changelog:
## überwacht den Verbindungsaufbau über wpa_supplicant und ändert die Prozess-ID
## für Network-Manager, Wicd und andere Manager bei Verbindungsproblemen
## speziell für ubuntu 8.04 und 9.04
##
## V0.2.1c
## Novenber 2009
## Anpassungen für Ubuntu 9.10 Karmic Koala
## Script optimiert. Prozesspriorität variabel einstellbar.
##
## V0.2.1b für NM
## Script optimiert. Prozesspriorität des NM erhöht.
##
## V0.2.1
## Debug-Modus möglich. Programmaufruf prcprio.sh -d im Terminal
## Überwachung der LAN-Schnittstelle und WLAN-Schnittstelle
## Verbindungsüberwachung über IP und Ping (optional)
##
## V0.1.1
## Code verbessert
## Logbuchausgaben überarbeitet und erweitert
### Variablen
### Zeiten für die Loops und Wartezeiten in Sekunden - Werte ggf. anpassen
### LAN-Verbindung prüfen
LAN_Interface="eth0"
### Überwachungsintervall wenn LAN-Verbindung als aktiv erkannt wurde
slow_Loop_LAN=120
## Wartezeit vor renice bis wpa_supplicant sicher gestartet ist (0-4)
wait_to_renice_wpa=0
## Prozessüberwachung bevor wpa_supplicant gestartet ist (4-6)
fast_Loop=4
## Prozessüberwachung nachdem die Prozesspriorität von wpa_supplicant geändert wurde
## diese Zeit in Sek. steht auch dem Manager zur Verfügung eine Verbindung herzustellen
## Intervall für die Überwachung der WLAN-Verbindung
slow_Loop=65
### WLAN_Interface = Schnitstelle ggf. anpassen
WLAN_Interface="wlan0"
### Prozessprioritäten
### Wert für Prozesspriorität wpa_supplicant - Wert ggf. anpassen (+19 default)
prcprio=+19
### Priorität von ndiswrapper ändern ja(1) default, nein(0)
ndiswrapper=1
### Prozesspriorität für ndiswrapper (-20 bis +19)
### ubuntu 8.04 -9.04: +19
### ubuntu 9.10: -12 bis -6 (-8 default)
prio_ndis=-8
### Priorität des Network-Manager ändern ja(1) default, nein(0)
reniceNM=1
### Prozesspriorität für Network-Manager (-20 bis +19)
### ubuntu 8.04 -9.04: +19
### ubuntu 9.10: 0 - +10 (+6 default)
prio_NM=+6
### Verbindungsprüfung
### ping-Check aktiv (1) (default) / abgeschaltet (0)
### zusätzliche Überwachung der Verbindung über ping
pingcheck=1
### IP-Adresse die angepingt werden soll (nur 1 Ping)
### IP-des Routers, Gateways oder Adresse (z.B. google.de) eintragen
pingip="192.168.178.1"
### Namen und Pfade der Protokolldateien ggf. anpassen
File="prcprio.log"
Path="`pwd`"
LogFile="$Path"/"$File"
### LOG sichtbar(1) (default) - Log versteckt(0)
logvisible=1
### Debug-Modus aus(0) (default)
debug=0
### allg. Variablen
IP="unknown"
DummyLIP="unknown"
Control=0
PID=0
Datum="`date`"
pingout="waiting for ping"
DebugMessage="startup"
nLoop=$slow_Loop
lcounter=0
LIP=""
### Programm
if [ "$1" = "-d" ]; then
debug=1
fi
if [ "$logvisible" = 0 ]; then
LogFile="$Path"/."$File"
echo "prcprio V0.2.1c - Logbuch versteckt" >> $LogFile
fi
if [ "$pingcheck" = 0 ]; then
pingout="deactivated"
fi
if [ "$debug" = 1 ]; then
echo "prcprio Debug-Mode aktiviert"
fi
echo "prcprio V0.2.1c für Network-Manager 2009 by Elektronenblitz63" > $LogFile
echo "published under GPL v3" >> $LogFile
echo "$Datum Programmstart" >> $LogFile
if [ "$ndiswrapper" = 1 ]; then
echo "Ändere die Priorität von Ndiswrapper (ndis_wq/wrapndis_wq)" >> $LogFile
renice $prio_ndis $(pidof ndis_wq) >> $LogFile
renice $prio_ndis $(pidof wrapndis_wq) >> $LogFile
fi
if [ "$reniceNM" = 1 ]; then
echo "Ändere die Priorität des Network-Manager" >> $LogFile
renice $prio_NM $(pidof NetworkManager) >> $LogFile
fi
echo "Phase $Control - starte Loop - $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
### Loop
while true
do
lcounter=$[$lcounter+1]
### PID of wpa_supplicant
PID="`(pidof -s wpa_supplicant)`"
### Debugging on ?
if [ "$debug" = 1 ]; then
echo
echo "Loop:$lcounter Timer: fast:$fast_Loop slow-WLAN:$slow_Loop slow-LAN:$slow_Loop_LAN wait wpa:$wait_to_renice_wpa"
echo "Phase $Control - wpa_s-PID:$PID - Message: $DebugMessage"
echo "Ping: $pingout - WLAN ip-$IP - LAN ip-$DummyLIP"
fi
### looking for Process and renice
if [ "$Control" = 2 ]; then
Control=3
DebugMessage="renice Process - Looptimer: $slow_Loop s"
echo "Phase 3 - Loop $slow_Loop Sek. - starte Schnittstellenüberwachung" >> $LogFile
elif [ "$Control" = 1 ]; then
Control=2
echo "Phase 1 - wait to renice Prozess Nr:$PID (wpa_supplicant)" >> $LogFile
sleep "$wait_to_renice_wpa"
renice ${prcprio} ${PID} >> $LogFile
DebugMessage="wait to renice"
echo "Phase 2 - Priorität Prozess Nr:$PID=$prcprio (wpa_supplicant) geändert." >> $LogFile
sleep 1
### something wrong ? - kill Process
### check ping / kill Process if necessary
elif [ "$pingout" = "100% packet loss" ]; then
Datum="`date`"
echo "$Datum kann Host nicht pingen - kill wpa_supplicant" >> $LogFile
killall wpa_supplicant
IP="unknown"
pingout="waiting for ping"
Control=0
slow_Loop=$nLoop
DummyLIP="unknown"
DebugMessage="Warning! - Reset- no ping received !"
echo "Phase $Control - Prozess beendet - $IP - Loop $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
sleep 1
### dont kill if LAN is active
elif [ "$LIP" != "" ]; then
slow_Loop=$slow_Loop_LAN
IP="Dummy"
DummyLIP=$LIP
LIP=""
DebugMessage=" LAN-IP detected Loop $slow_Loop_LAN s - clear LAN-IP Buffer - check at next Loop"
echo "LAN aktiv - Intervalltimer auf $slow_Loop_LAN" >> $LogFile
### check WLAN-IP / kill Process if necessary
elif [ "$IP" = "" ]; then
Datum="`date`"
echo "$Datum keine IP-Adresse LAN/WLAN-Interface - kill wpa_supplicant" >> $LogFile
killall wpa_supplicant
IP="unknown"
pingout="waiting for ping"
Control=0
slow_Loop=$nLoop
DummyLIP="unknown"
DebugMessage="Warning! Reset Prozess - no LAN or WLAN-IP"
echo "Phase $Control - Prozess beendet - WLAN-IP: $IP - Loop $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
sleep 1
### no Client active - check Process
elif [ "$PID" = "" ]; then
Control=0
sleep "$fast_Loop"
DebugMessage="wpa_supplicant no PID - checking LAN"
elif [ "$Control" = 0 ]; then
Control=1
DebugMessage="waiting for PID"
elif [ "$Control" = 3 ]; then
sleep "$slow_Loop"
DebugMessage="doing normal Loop - Looptimer: $slow_Loop s"
### get IP's
IP=$(LANG=C ifconfig $WLAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
sleep 1
LIP=$(LANG=C ifconfig $LAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
sleep 1
Datum="`date`"
echo "$Datum - LAN/WLAN ip-$IP$LIP - prüfe Verbindung: ping to ip-$pingip - $pingout" >> $LogFile
pingout="deactivated"
### pinging if activated
if [ "$pingcheck" = 1 ]; then
pingout="`(ping -c1 $pingip | egrep -wo '100% packet loss|0% packet loss|connect: Network is unreachable')`"
sleep 2
### get WLAN-IP
IP=$(LANG=C ifconfig $WLAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
###
fi
fi
done
exit 0Skriptversion 0.2.1c für Wicd (prcprio_wicd.sh):
#!/bin/bash
## prcprio.sh V0.2.1c by Elektronenblitz63 (UbuntuUsers.de) 2009
## Version for Wicd
## elektronenblitz63@online.de
## published under GPL v3
##
## Changelog:
## 28. April 2009
## überwacht den Verbindungsaufbau über wpa_supplicant und ändert die Prozess-ID
## für Network-Manager, Wicd und andere Manager bei Verbindungsproblemen
## speziell für ubuntu 8.04 und 9.04
##
## V0.2.1c
## Novenber 2009
## Anpassungen für Ubuntu 9.10 Karmic Koala
## Script optimiert. Prozesspriorität variabel einstellbar.
##
## V0.2.1
## Debug-Modus möglich. Programmaufruf prcprio.sh -d im Terminal
## Überwachung der LAN-Schnittstelle und WLAN-Schnittstelle
## Verbindungsüberwachung über IP und Ping (optional)
##
## V0.1.1
## Code verbessert
## Logbuchausgaben überarbeitet und erweitert
### Variablen
### Zeiten für die Loops und Wartezeiten in Sekunden - Werte ggf. anpassen
### LAN-Verbindung prüfen
LAN_Interface="eth0"
### Überwachungsintervall wenn LAN-Verbindung als aktiv erkannt wurde
slow_Loop_LAN=120
## Wartezeit vor renice bis wpa_supplicant sicher gestartet ist (0-4)
wait_to_renice_wpa=0
## Wartezeit vor renice bis der DHCP-Client sicher gestartet ist (2-8)
wait_to_renice_client=6
## Prozessüberwachung bevor wpa_supplicant gestartet ist (4-6)
fast_Loop=4
## Prozessüberwachung nachdem die Prozesspriorität von wpa_supplicant geändert wurde
## diese Zeit in Sek. steht auch dem Manager zur Verfügung eine Verbindung herzustellen
## Intervall für die Überwachung der WLAN-Verbindung
slow_Loop=60
### DHCP-Client (dhclient)(default), (dhpcpd) (pump)
client="dhclient"
### WLAN_Interface = Schnitstelle ggf. anpassen
WLAN_Interface="wlan0"
### Beendet laufende Prozesse von wpa_supplicant und DH-CLient bei Startup
### aktiv (1) (default) / abgeschaltet (0)
startupkill=1
### Prozessprioritäten
### Wert für Prozesspriorität DHCP-Client - Wert ggf. anpassen
prcprio_client=+19
### Wert für Prozesspriorität wpa_supplicant - Wert ggf. anpassen
prcprio=+19
### Priorität von ndiswrapper ändern ja(1) default, nein(0)
ndiswrapper=1
### Prozesspriorität für ndiswrapper (-20 bis +19)
### ubuntu 8.04 -9.04: +19
### ubuntu 9.10: -6 bis +4 (0 default)
prio_ndis=0
### ping-Check aktiv (1) (default) / abgeschaltet (0)
### zusätzliche Überwachung der Verbindung über ping
pingcheck=1
### IP-Adresse die angepingt werden soll (nur 1 Ping)
### IP-des Routers, Gateways oder Adresse (z.B. google.de) eintragen
pingip="192.168.178.1"
### Namen und Pfade der Protokolldateien ggf. anpassen
File="prcprio.log"
Path="`pwd`"
LogFile="$Path"/"$File"
### LOG sichtbar(1) (default) - Log versteckt(0)
logvisible=1
### Debug-Modus aus(0) (default)
debug=0
### allg. Variablen
IP="unknown"
DummyLIP="unknown"
Control=0
PID=0
Datum="`date`"
pingout="waiting for ping"
DebugMessage="startup"
nLoop=$slow_Loop
lcounter=0
LIP=""
### Programm
if [ "$1" = "-d" ]; then
debug=1
fi
if [ "$logvisible" = 0 ]; then
LogFile="$Path"/."$File"
echo "prcprio V0.2.1c - Logbuch versteckt" >> $LogFile
fi
if [ "$pingcheck" = 0 ]; then
pingout="deactivated"
fi
if [ "$debug" = 1 ]; then
echo "prcprio Debug-Mode aktiviert"
fi
echo "prcprio V0.2.1c for WICD Network-Manager 2009 by Elektronenblitz63" > $LogFile
echo "published under GPL v3" >> $LogFile
echo "$Datum Programmstart" >> $LogFile
if [ "$ndiswrapper" = 1 ]; then
echo "Ändere die Priorität von Ndiswrapper (ndis_wq/wrapndis_wq) und Wicd" >> $LogFile
renice $prio_ndis $(pidof ndis_wq) >> $LogFile
renice $prio_ndis $(pidof wrapndis_wq) >> $LogFile
fi
if [ "$startupkill" = 1 ]; then
killall wpa_supplicant
killall $client
echo "laufende Prozesse beendet" >> $LogFile
fi
echo "Phase $Control - starte Loop - $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
### Loop
while true
do
lcounter=$[$lcounter+1]
### PID of wpa_supplicant
PID="`(pidof -s wpa_supplicant)`"
### Debugging on ?
if [ "$debug" = 1 ]; then
echo
echo "Loop:$lcounter Timer: fast:$fast_Loop slow-WLAN:$slow_Loop slow-LAN:$slow_Loop_LAN wait wpa:$wait_to_renice_wpa"
echo "Phase $Control - wpa_s-PID:$PID - Client-PID:$PID_client - Message: $DebugMessage"
echo "Ping: $pingout - WLAN ip-$IP - LAN ip-$DummyLIP"
fi
### looking for Process and renice
if [ "$Control" = 2 ]; then
Control=3
DebugMessage="renice Process - Looptimer: $slow_Loop s"
echo "Phase 3 - Loop $slow_Loop Sek. - starte Schnittstellenüberwachung" >> $LogFile
elif [ "$Control" = 1 ]; then
Control=2
echo "Phase 1 - wait to renice Prozess Nr:$PID (wpa_supplicant)" >> $LogFile
sleep "$wait_to_renice_wpa"
renice ${prcprio} ${PID} >> $LogFile
sleep "$wait_to_renice_client"
PID_client="`(pidof -s $client)`"
renice ${prcprio_client} ${PID_client} >> $LogFile
DebugMessage="Renice Processes"
echo "Phase 2 - Priorität Prozess Nr:$PID=$prcprio (wpa_supplicant) und $PID_client:=$prcprio_client ($client) geändert." >> $LogFile
sleep 1
### something wrong ? - kill Process
### check ping / kill Process if necessary
elif [ "$pingout" = "100% packet loss" ]; then
Datum="`date`"
echo "$Datum kann Host nicht pingen - kill wpa_supplicant/DHCP-Client" >> $LogFile
killall wpa_supplicant
killall $client
IP="unknown"
pingout="waiting for ping"
Control=0
slow_Loop=$nLoop
DummyLIP="unknown"
DebugMessage="Warning! - Reset- no ping received !"
echo "Phase $Control - Prozess beendet - $IP - Loop $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
sleep 1
### dont kill if LAN is active
elif [ "$LIP" != "" ]; then
slow_Loop=$slow_Loop_LAN
IP="Dummy"
DummyLIP=$LIP
LIP=""
DebugMessage=" LAN-IP detected Loop $slow_Loop_LAN s - clear LAN-IP Buffer - check at next Loop"
echo "LAN aktiv - Intervalltimer auf $slow_Loop_LAN" >> $LogFile
### check WLAN-IP / kill Process if necessary
elif [ "$IP" = "" ]; then
Datum="`date`"
echo "$Datum keine IP-Adresse LAN/WLAN-Interface - kill wpa_supplicant/DHCP-Client" >> $LogFile
killall wpa_supplicant
killall $client
IP="unknown"
pingout="waiting for ping"
Control=0
slow_Loop=$nLoop
DummyLIP="unknown"
DebugMessage="Warning! Reset Prozess - no LAN or WLAN-IP"
echo "Phase $Control - Prozess beendet - WLAN-IP: $IP - Loop $fast_Loop Sek. - warte auf wpa_supplicant" >> $LogFile
sleep 1
### no Client active - check Process
elif [ "$PID" = "" ]; then
Control=0
sleep "$fast_Loop"
DebugMessage="wpa_supplicant no PID - checking LAN"
elif [ "$Control" = 0 ]; then
Control=1
DebugMessage="waiting for PID"
elif [ "$Control" = 3 ]; then
sleep "$slow_Loop"
DebugMessage="doing normal Loop - Looptimer: $slow_Loop s"
### get IP's
IP=$(LANG=C ifconfig $WLAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
sleep 1
LIP=$(LANG=C ifconfig $LAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
sleep 1
Datum="`date`"
echo "$Datum - LAN/WLAN ip-$IP$LIP - prüfe Verbindung: ping to ip-$pingip - $pingout" >> $LogFile
pingout="deactivated"
### pinging if activated
if [ "$pingcheck" = 1 ]; then
pingout="`(ping -c1 $pingip | egrep -wo '100% packet loss|0% packet loss|connect: Network is unreachable')`"
sleep 2
### get WLAN-IP
IP=$(LANG=C ifconfig $WLAN_Interface | grep 'inet addr' | awk {'print $2'} | sed -e 's/"//g')
###
fi
fi
done
exit 0Diese Revision wurde am 20. August 2010 09:03 von elektronenblitz63 erstellt.
2004 – 2017 ubuntuusers.de • Einige Rechte vorbehalten