##Bitte hier den eigenen Benutzernamen und das geplante Fertigstellungsdatum eintragen ## [[Vorlage(InArbeit, 01.10.2009, Elektronenblitz63)]] [[Vorlage(Archiviert,)]] ##[[Vorlage(Getestet, )]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] [:Editor:Einen Editor öffnen] [:sudo: root-Rechte] [:Shell/Bash-Skripting-Guide für Anfänger:] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/terminal.png, 80,)]] 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. Beim Aufbau einer WLAN-Verbindung wird wegen einer zu hohen Prozesspriorität von [:WLAN/wpa_supplicant:wpa_supplicant] und des verwendeten Managers 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 [post:1942046:Forenbeitrag] Merkmale des Skripts:\\ * Speziell angepasste Versionen für den [:Network-Manager:] und Wicd. Für Wicd gibt es alternativ auch einen [post:1946278: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 = Manuelle Überprüfung = Prozesspriorität bei laufendem Verbindungsversuch im Terminal [1] ändern. Siehe dazu auch [:Shell/nice:]. {{{#!vorlage Befehl 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 [wikipedia:Debugger: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. = Skript erstellen = Mit einem Editor [2] erzeugt man eine leere Datei und kopiert den zum verwendeten Manager passenden Code des des unter [:Skripte/WLAN-Prozesspriorität#Versionen:Versionen] aufgezeigten Skriptes hinein und speichert unter entsprechendem Dateinamen ab. Anschließend muss das Skript noch ausführbar gemacht werden [4]. == Parameter anpassen == 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. == Skript testen und optimieren == Zum testen und ermitteln der optimalen Zeiten der internen Zeitgeber das Skript zuerst über Terminal [1][3] im Debugmodus starten: {{{#!vorlage Befehl 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 [[Vorlage(Tasten, ctrl+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'''). == Debug-Meldungen == 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 ... }}} === Details === 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 }}} == Logbuch == 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. {{{#!vorlage Befehl 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 }}} = Automatischer Start = 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. = Versionen= 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 0 }}} Skriptversion 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 0 }}} # tag: Internet, Netzwerk