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
|