ubuntuusers.de

WLAN-Prozesspriorität

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

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

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Wiki/Icons/terminal.png

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:

Manuelle Überprüfung

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.

Skript erstellen

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].

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:

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).

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.

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

Diese Revision wurde am 20. August 2010 09:03 von elektronenblitz63 erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Internet, Netzwerk