Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

24.08.2010, 13:31

shell script für netzwerkspeed auslesen

Momentan bin ich noch am frickeln, welches GUI ich für hardwareschwache Rechner gerne nutze. Da ich dort gerne die minimalistische Schiene fahre sind so Dinger wie xmonad, i3, awesome & Co in die engere Wahl gekommen, wobei i3 für mich gewonnen hat.
Nun würde ich aber gerne (hauptsächlich) den Netzwerktraffic und die Prozessorlast irgendwie "monitoren".
Als Möglichkeiten gäbe es conky & Co, lassen sich aber schlecht in den Hintergrund integrieren und sind ja nicht immer sichtbar. Also eine "bar". Man könnte sogar iwi die gnomebar integrieren, was aber dem Minimalprinzip widerspricht. Also sowas wie dzen oder xmobar. Akut teste ich die xmobar, die mich ziemlich zufriedenstellt, außer dass sie für wireless Adapter nicht die Geschwindigkeit bereitstellt; man kann nur die IP und Signalstärke anzeigen lassen, was mich eher sekundär interessierte.

Ergo:
Wir müssen mal wieder auf die schier unendlichen Bash Möglichkeiten zurückgreifen.
Für die Netzwerklast benutze ich mal /proc/net/dev
damit erhalten wir eine recht schicke Übersicht

Quellcode

1
2
3
4
5
6
7
poedel@pcslap ~ $ cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:     100       2    0    0    0     0          0         0      100       2    0    0    0     0       0          0
  eth0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
 wifi0: 3033049   38174    0    0    0    77          0         0   270720    1986    0    0    0     0       0          0
  ath1:  777936    1386    0    0    0     0          0         0   204797    1596    0    0    0     0       0          0


Hinter ath1: habe ich den Wert in Bytes, der seit dem letzten Neustart erhalten wurde.
Leider ist der Wert ohne Leerzeichen hinter dem Doppelpunkt, was das Zerpflücken etwas erschwert.
Akut lautet meine Zugriffsmethode so:

Quellcode

1
awk -F ':' '/ath1/ {print $2}' /proc/net/dev | tr -s ' ' | cut -d ' ' -f 2

wobei ich noch nicht sagen kann was passiert, wenn ich die nächste Dezimalstelle erreiche *G*

Dazu also die ersten 2 Fragen:
1) Hat jemand eine Idee, wie ich genau diese Zahl und die vom TX (hier 204797) herausfiltern kann, oder wird mein
kleiner Code das packen?
2) Ich lese die Zahl aus, lasse das Script 1 Sekunde warten und lese es nochmal.
Die Differenz ist IMHO Bytes pro Sekunde. Multipliziert mit 60 wären es Bytes pro Minute.
Das entspricht beim RX aber nicht den 16mbit, die ich aber beim Test tatsächlich erhalte.

Also nächstes ist ja das, oder gar die Netzwerkgeräte nicht an jedem der Rechner gleich, an denen ich das Skript anwenden möchte.
Da man mit $1 & Co ja Eingabeparameter abfangen kann, müßte man diese doch auch in das Script integrieren können, so dass man
es wie folgt aufrufen könnte

Quellcode

1
./meinbashscript.sh eth0 ath1

Das werde ich aber zur not durch Testerei noch selber hinbekommen.

Damit man sich vorstellen kann, was ich da bastel hänge ich das Skript mal hier als letztes an, um nicht weiter oben schon vor dem Lesen Angst zu machen *G*

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/sh
#poedel_PCS
#
# Berechne Traffic der vorhandenen Netzwerkschnittstellen und 
# erstelle daraus ascii Grafiken
jnt=0
jnt2=0

#Berechne Geschwindigkeit und speicher in Variable float
for (( c=1; c<=2; c++ )) do
  float=`awk -F ':' '/ath1/ {print $2}' /proc/net/dev | tr -s ' ' | cut -d ' ' -f 2`
  float2=`awk -F ':' '/ath1/ {print $2}' /proc/net/dev | tr -s ' ' | cut -d ' ' -f 10`
  # konvertiere float in integer
  int=$(printf "%.f" $float)
  int2=$(printf "%.f" $float2)
  avr=$((($int - $jnt)*60))
  avr2=$((($int2 -$jnt2)*60))
  jnt=$int
  jnt2=$int2
  #echo "debug jnt = $jnt jnt2 = $jnt2 zeh: $c"
  if [ $c -eq 1 ]; then
    sleep 1
  fi
done
#echo "RX: $avr Bytes/min -  TX: $avr2 Bytes/min"

# Grafische Pawnierung
avr=$[$avr+1]
bars=`expr 10000000 / $avr`
case $bars in
  0)  bar='[----------]' ;;
  1)  bar='[/---------]' ;;
  2)  bar='[//--------]' ;;
  3)  bar='[///-------]' ;;
  4)  bar='[////------]' ;;
  5)  bar='[/////-----]' ;;
  6)  bar='[//////----]' ;;
  7)  bar='[///////---]' ;;
  8)  bar='[////////--]' ;;
  9)  bar='[/////////-]' ;;
 10)  bar='[//////////]' ;;
  *)  bar='[----!!----]' ;;
esac

avr2=$[$avr2+1]
bars=`expr 10000000 / $avr2`
case $bars in
  0)  bar2='[----------]' ;;
  1)  bar2='[/---------]' ;;
  2)  bar2='[//--------]' ;;
  3)  bar2='[///-------]' ;;
  4)  bar2='[////------]' ;;
  5)  bar2='[/////-----]' ;;
  6)  bar2='[//////----]' ;;
  7)  bar2='[///////---]' ;;
  8)  bar2='[////////--]' ;;
  9)  bar2='[/////////-]' ;;
 10)  bar2='[//////////]' ;;
  *)  bar2='[----!!----]' ;;
esac


echo $bar $bar2
System:
i7 P2600 @ 3,4GHz
jabber: poedel@jabber.ccc.de