jokerGermany
Anmeldungsdatum: 11. Mai 2008
Beiträge: 1003
|
Die Ausgabe des Scripts mit set -x
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 | + read
+ ifconfig
+ grep 'Link encap'
+ awk -F ' ' '{print $1}'
+ grep eth
+ hilfe=hilfe.txt
+ hilfevorhanden=0
++ ifconfig eth0
++ grep 192.168
+ [[ -n inet Adresse:192.168.117.12 Bcast:192.168.117.255 Maske:255.255.255.0 ]]
++ date +%s
+ datumjetzt=1359241262
+ upsec='292173.56 2330524.84'
+ upsec=292173
++ echo 292173/3600
++ bc -l
+ upStunde=81.15916666666666666666
++ echo 292173/86400
++ bc -l
+ upTag=3.38163194444444444444
++ ifconfig eth0
++ grep 'RX bytes:'
++ cut -d: -f2
++ awk '{print $1}'
+ RXinBytes=480171987
++ echo '480171987/(1024*1024)'
++ bc -l
+ RXinMB=457.92769145965576171875
++ ifconfig eth0
++ grep 'TX bytes:'
++ cut -d: -f3
++ awk '{print $1}'
+ TXinBytes=19077613710
++ echo '19077613710/(1024*1024)'
++ bc -l
+ TXinMB=18193.83021354675292968750
+ IFS=:
+ [[ -f hilfe.txt ]]
+ hilfevorhanden=1
+ x=0
+ liste=upsecalt:datesecalt:RXinMBalt:TXinMBalt
++ cat hilfe.txt
+ for j in '$(cat $hilfe)'
+ x=1
+ '[' -z 205779 ']'
+ for j in '$(cat $hilfe)'
+ x=2
+ '[' -z 396.61765670776367187500 ']'
+ for j in '$(cat $hilfe)'
+ x=3
+ '[' -z 18147.23063945770263671875 ']'
+ for j in '$(cat $hilfe)'
+ x=4
+ '[' -z 1359154864 ']'
+ for j in '$(cat $hilfe)'
+ x=5
+ '[' -z 26.01.2013 ']'
+ [[ 1 == \1 ]]
++ cat hilfe.txt
++ cut -d: -f1
+ upsecalt=205779
++ cat hilfe.txt
++ cut -d: -f4
+ datesecalt=1359154864
+ '[' 205779 -lt 292173 -a 1358949089 -lt 1359154864 ']'
+ '[' 1359158462 -lt 1359154864 ']'
+ '[' 1359151262 ']'
++ date +%d.%m.%Y
++ hostname
+ echo '27.01.2013 - Das Script wurde schon seit mehr als 25 Stunden auf dem Server herakles nicht mehr ausgeführt!'
27.01.2013 - Das Script wurde schon seit mehr als 25 Stunden auf dem Server herakles nicht mehr ausgeführt!
++ cat hilfe.txt
++ cut -d: -f2
+ RXinMBalt=396.61765670776367187500
++ cat hilfe.txt
++ cut -d: -f3
+ TXinMBalt=18147.23063945770263671875
++ bc -l
/net/kepheus/system/scripte/auswertungnetzwerkdurchsatz.sh: Zeile 73: 457.92769145965576171875-396.61765670776367187500: Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".92769145965576171875-396.61765670776367187500\").
+ RXinMB=
++ bc -l
/.../scripte/auswertungnetzwerkdurchsatz.sh: Zeile 74: 18193.83021354675292968750-18147.23063945770263671875: Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".83021354675292968750-18147.23063945770263671875\").
+ TXinMB=
++ bc -l
/.../scripte/auswertungnetzwerkdurchsatz.sh: Zeile 75: 3.38163194444444444444-: Syntaxfehler: Ungültiger arithmetischer Operator. (Fehlerverursachendes Zeichen ist \".38163194444444444444-\").
+ upAktuell=
++ echo /
++ bc -l
(standard_in) 1: syntax error
+ RXinMBproTag=
++ echo /
++ bc -l
(standard_in) 1: syntax error
+ TXinMBproTag=
++ date +%s
++ date +%d.%m.%Y
+ echo 292173:::1359241262:27.01.2013
++ date +%d.%m.%Y
+ echo -e '27.01.2013;;'
++ hostname
+ read
|
Das Script selber:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 | #!/bin/bash
#Was das Script nicht abfängt:
#Wenn zwischen der Definition von upsec und datumjetzt eine neue Sekunde beginnt
#Vorraussetzungen:
#Auslesen welche eth Interfaces es alles gibt und diese in einer Schleife abarbeiten
(ifconfig | grep "Link encap"| awk -F ' ' '{print $1}' | grep eth) | while read; do
#Enthält das Interface den String 192.168?
hilfe=hilfe.txt
hilfevorhanden="0"
if [[ -n $(ifconfig $REPLY | grep 192.168) ]]
then
#Falls die Laufzeit des Scriptes mehr als eine Sekunde beträgt:
datumjetzt=$(date +%s)
#Sekunden seit Kernelstart und Idle Time auslesen
upsec="$(< /proc/uptime)"
#Nur ganze Sekunden und keine Idle Time
upsec=${upsec%%.*}
upStunde=`echo "$upsec/3600" | bc -l`
upTag=`echo "$upsec/86400" | bc -l`
RXinBytes=$(ifconfig $REPLY | grep 'RX bytes:' | cut -d":" -f2 | awk '{print $1}')
RXinMB=`echo "$RXinBytes/(1024*1024)" | bc -l`
TXinBytes=$(ifconfig $REPLY | grep 'TX bytes:' | cut -d":" -f3 | awk '{print $1}')
TXinMB=`echo "$TXinBytes/(1024*1024)" | bc -l`
IFS=:
if [[ -f $hilfe ]]
then
hilfevorhanden="1"
x=0
liste=upsecalt:datesecalt:RXinMBalt:TXinMBalt
for j in $(cat $hilfe) #${hilfe[@]}
do
x=$(($x+1))
if [ -z $j ]
then
hilfevorhanden="0"
echo "$(date +%d.%m.%Y) - Einige Variablen aus der hilfe-Datei sind unvollständig, ignoriere Hilfedatei!"
break
#else
#`echo ${liste[$x]}`=$j
#echo ${liste[$x]}
#echo ${liste[2-1]}
fi
done
fi
if [[ $hilfevorhanden == "1" ]]
then
#if1
upsecalt=$(cat $hilfe | cut -d":" -f1)
datesecalt=$(cat $hilfe | cut -d":" -f4)
if [ $upsecalt -lt $upsec -a $(($datumjetzt - $upsec)) -lt $datesecalt ] #-lt = kleiner
#if2
then
#Alles planmäßig (mehr oder weniger)
#Wenn das heutige Datum - 23 Stunden kleiner als das alte Datum ist.
if [ $(($datumjetzt - 23*3600)) -lt $datesecalt ]
#if3
then
echo "$(date +%d.%m.%Y) - Das Script wurde vor weniger als 23 Stunden schon einmal auf dem Server $(hostname) ausgeführt, breche ab!"
exit 1
else
if [ $(($datumjetzt - 25*3600)) > $datesecalt ]
#if4
then
echo "$(date +%d.%m.%Y) - Das Script wurde schon seit mehr als 25 Stunden auf dem Server $(hostname) nicht mehr ausgeführt!"
fi
#/if4
RXinMBalt=$(cat $hilfe | cut -d":" -f2)
TXinMBalt=$(cat $hilfe | cut -d":" -f3)
RXinMB=`echo $(($RXinMB-$RXinMBalt))| bc -l`
TXinMB=`echo $(($TXinMB-$TXinMBalt))| bc -l`
upAktuell=`echo $(($upTag-$upTagalt))| bc -l`
RXinMBproTag=`echo "$RXinMB/$upAktuell" | bc -l`
TXinMBproTag=`echo "$TXinMB/$upAktuell" | bc -l`
fi
#/if3
else
#upTagalt>upTag
if [ $(echo "if ($upStunde>25) 1 else 0" | bc) -eq 1 ]
#if5
then
echo "$(date +%d.%m.%Y) - Das Script wurde schon seit mehr als 25 Stunden auf dem Server $(hostname) nicht mehr ausgeführt und der Server wurde/ist neu gestartet!"
else
echo "$(date +%d.%m.%Y) - Der Server $(hostname) wurde/ist innerhalb der letzten 25 Stunden neu gestartet!"
fi
#/if5
RXinMBproTag=`echo "$RXinMB/$upTag" | bc -l`
TXinMBproTag=`echo "$TXinMB/$upTag" | bc -l`
fi
#/if2
else
echo "$(date +%d.%m.%Y) - Datei $hilfe existiert nicht oder Variablen aus dieser sind unvollständig!"
if [ $(echo "if ($upStunde>25) 1 else 0" | bc) -eq 1 ]
#if6
then
echo "$(date +%d.%m.%Y) - Das Script wurde schon seit mehr als 25 Stunden auf dem Server $(hostname) nicht mehr ausgeführt!"
else
echo "$(date +%d.%m.%Y) - Dieser Server läuft seit $upStunde Stunde(n)"
fi
#/if6
echo "Der Rechner wurde/ist neu gestartet oder die Datei $hilfe wurde (versehentlich) gelöscht..."
RXinMBproTag=`echo "$RXinMB/$upTag" | bc -l`
TXinMBproTag=`echo "$TXinMB/$upTag" | bc -l`
fi
#/if1
echo "$upsec:$RXinMB:$TXinMB:$(date +%s):$(date +%d.%m.%Y)" > $hilfe
echo -e "$(date +%d.%m.%Y);$TXinMBproTag;$RXinMBproTag" >> $(hostname).txt
fi
done
|
Was soll es machen?
Auf dem richtigen Interface ermitteln wie viel die Netzwerkkarte hochgeladen und runtergeladen hat
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Warum machst Du das so jämmerlich kompliziert ? Im Grunde willst Du doch nur ein Mal ifconfig aufrufen, und die Ausgabe dann auswerten ? - richtig ? Dann mach das doch auch einfach genau so: ifconfig | ./auswerteskript mit einem geeigneten Auswerteskript. → Dafür würde ich awk vorschlagen (oder eine andere Hochsprache, mit der Du vertraut bist). Damit geht das auswählen und rechnen recht bequem, - auf jeden Fall um Klassen eleganter als mit der Shell. Vielleicht reicht das ja schon: #!/usr/bin/awk -f
/^eth/ { iface= $1; }
/^ *RX byte/ { gsub("bytes:", "" );
daten= "heruntergeladen: " $2 " " $3 $4 "\theraufgeladen: " $6 " " $7 $8; }
/^$/ { if( iface ) print iface ":\t" daten;
iface= ""; } LG, track
|
jokerGermany
(Themenstarter)
Anmeldungsdatum: 11. Mai 2008
Beiträge: 1003
|
1. Es soll jedes Interface auf das die gesuchte IP zutrifft auswerten
2. Die Server laufen Wochenlang durch, umso genauer die Werte umso besser (deswegen die hilfedatei)
3. Es soll der Durchschnitt pro Tag so genau wie möglich angegeben werden.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
| RXinMB=`echo $(($RXinMB-$RXinMBalt))| bc -l`
TXinMB=`echo $(($TXinMB-$TXinMBalt))| bc -l`
|
Bash macht keine Fließkommaarithmetik. Was soll das -l bei bc? | RXinMB=$(echo $RXinMB-$RXinMBalt | bc)
|
Wozu überhaupt bc, wenn Du es vorab ausrechnest?
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Also willst Du im Grunde 2 Skripte haben: eines, das die Daten täglich sammelt und eines, das dann daraus den Mitelwert bildet ? Auch dann solltest Du das genau so machen. Das 1. Skript sammelt die Daten (per cron ?) Ein schöner Trenner für die Blöcke ist dabei das TAB, das sieht gut aus und lässt sich gut verarbeiten. Allerdings brauchst Du dann noch einen Datumsstempel dazu: #!/usr/bin/awk -f
/^eth/ { iface= $1; }
/^ *RX byte/ { gsub("bytes:", "" );
daten= "heruntergeladen: " $2 " " $3 $4 "\theraufgeladen: " $6 " " $7 $8; }
/^$/ { if( iface ) print strftime("%F %R\t") iface "\t" daten >> "eth-logdatei" ;
iface= ""; } und zur Auswertung verfütterst Du dann die "eth-logdatei" an ein 2. awk Skript, das aus den Zeitstempeln und den Daten dann die Statistik zieht. track
|
jokerGermany
(Themenstarter)
Anmeldungsdatum: 11. Mai 2008
Beiträge: 1003
|
user unknown schrieb: | RXinMB=`echo $(($RXinMB-$RXinMBalt))| bc -l`
TXinMB=`echo $(($TXinMB-$TXinMBalt))| bc -l`
|
Bash macht keine Fließkommaarithmetik. Was soll das -l bei bc? | RXinMB=$(echo $RXinMB-$RXinMBalt | bc)
|
man bc Define the standard math library.
Ich habs aus dem Internet und deswegen so übernommen, werde aber mal deine Variante Testen.
Danke
|
jokerGermany
(Themenstarter)
Anmeldungsdatum: 11. Mai 2008
Beiträge: 1003
|
track schrieb: Also willst Du im Grunde 2 Skripte haben: eines, das die Daten täglich sammelt und eines, das dann daraus den Mitelwert bildet ? Auch dann solltest Du das genau so machen. Ein schöner Trenner für die Blöcke ist dabei das TAB, das sieht gut aus und lässt sich gut verarbeiten. Allerdings brauchst Du dann noch einen Datumsstempel dazu: #!/usr/bin/awk -f
/^eth/ { iface= $1; }
/^ *RX byte/ { gsub("bytes:", "" );
daten= "heruntergeladen: " $2 " " $3 $4 "\theraufgeladen: " $6 " " $7 $8; }
/^$/ { if( iface ) print strftime("%F %R\t") iface "\t" daten >> "eth-logdatei" ;
iface= ""; } und zur Auswertung verfütterst Du dann die "eth-logdatei" wieder an ein awk Skript, das aus den Zeitstempeln und den Daten dann die Statistik zieht. track
awk ist mir irgendwie zu hoch XD
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
jokerGermany schrieb: man bc Define the standard math library.
Ich habs aus dem Internet und deswegen so übernommen, werde aber mal deine Variante Testen.
Danke
Ich weiß schon, was -l soll. Das brauchst Du, wenn Du mit Sinus und dergleichen rechnen willst. Du solltest nicht einfach eine Scriptcollage anfertigen, aus Sachen die Du so findest. Lern eine Scriptsprache Schritt für Schritt nach einer Anleitung, und dann kannst Du punktuell Wissen ergänzen, auch mit Fundstücken. Aber das prinzipielle muss man vorab mal strukturell lernen, sonst ist die Gefahr groß in offene Messer zu laufen ohne es zu ahnen. Du musst es eh alles lernen, nur unstrukturiert, wenn Du so vorgehst.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
jokerGermany schrieb: awk ist mir irgendwie zu hoch XD
Na ja, es ist etwas anders als die Shell, aber auch nicht viel komplizierter als z.B. sed ... Du sparst Dir damit diese unglaublich umständliche Murkserei, die Du mit der Shell brauchst, um Daten zu separieren und zu berechnen. Zweimal 6 Zeilen awk ersetzen über 100 Zeilen Shell ! - da ersparst Du Dir Tage an Fehlersuche. (aber, es war ja auch nur ein Vorschlag 😉 ...) track
|
radoe2
Anmeldungsdatum: 30. November 2006
Beiträge: 243
|
user unknown schrieb:
Ich weiß schon, was -l soll. Das brauchst Du, wenn Du mit Sinus und dergleichen rechnen willst.
Ausserdem ist -l eine bequeme Variante, bc mit scale=20 starten zu lassen. Normalerweise steht scale auf 0, und der ein oder andere wundert sich, warum 5/2 auf einmal 2 ergibt...
|
jokerGermany
(Themenstarter)
Anmeldungsdatum: 11. Mai 2008
Beiträge: 1003
|
Das script hier funktioniert anscheinend (zumindestens Zeigt es seit mehreren Tagen keinen Fehler an)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 | #!/bin/bash
#Was das Script nicht abfängt:
#Wenn zwischen der Definition von upsec und datumjetzt eine neue Sekunde beginnt
#Vorraussetzungen:
#Auslesen welche eth Interfaces es alles gibt und diese in einer Schleife abarbeiten
echo "======Start======"
(ifconfig | grep "Link encap"| awk -F ' ' '{print $1}' | grep eth) | while read; do
#Enthält das Interface den String 192.168?
hilfe=hilfe.txt
hilfevorhanden="0"
if [[ -n $(ifconfig $REPLY | grep 192.168) ]]
then
#Falls die Laufzeit des Scriptes mehr als eine Sekunde beträgt:
datumjetzt=$(date +%s)
#Sekunden seit Kernelstart und Idle Time auslesen
upsec="$(< /proc/uptime)"
#Nur ganze Sekunden und keine Idle Time
upsec=${upsec%%.*}
upStunde=`echo "$upsec/3600" | bc`
#upTag=`echo "$upsec/86400" | bc -l`
#RXinBytes=$(ifconfig $REPLY | grep 'RX bytes:' | cut -d":" -f2 | awk '{print $1}')
echo "Hier hat hat jetzt RX packets zu stehen verdammte Axt!"
ifconfig $REPLY |grep "RX packets" |cut -d: -f2 |cut -d" " -f1
RXinBytes=$(ifconfig $REPLY |grep "RX packets" |cut -d: -f2 |cut -d" " -f1 )
RXinMB=`echo "$RXinBytes/(1024*1024)" | bc`
#TXinBytes=$(ifconfig $REPLY | grep 'TX bytes:' | cut -d":" -f3 | awk '{print $1}')
echo "Hier hat hat jetzt TX packets zu stehen verdammte Axt!"
ifconfig $REPLY |grep "TX packets" |cut -d: -f2 |cut -d" " -f1
TXinBytes=$(ifconfig $REPLY |grep "TX packets" |cut -d: -f2 |cut -d" " -f1 )
TXinMB=`echo "$TXinBytes/(1024*1024)" | bc`
if [[ -f $hilfe ]]
then
hilfevorhanden="1"
liste=upsecalt:RXinMBalt:TXinMBalt:datesecalt
zaehler1=0
zaehler2=0
IFS=:
for i in $liste
do
for j in $(cat $hilfe) #${hilfe[@]}
do
if [ $zaehler1 == $zaehler2 ]
then
if [ -z $j ]
then
hilfevorhanden="0"
echo $(date +%d.%m.%Y)" - Einige Variablen aus der hilfe-Datei sind unvollständig, ignoriere Hilfedatei!"
break 2
#else
#`echo ${liste[$x]}`=$j
#echo ${liste[$x]}
#echo ${liste[2-1]}
fi
echo "Variable i: " $i
echo "Variable j: " $j
(( $i=$j ))
echo $upsecalt
break
fi
(( zaehler2++ ))
done$(ifconfig $REPLY | grep 'RX bytes:' | cut -d":" -f2 | awk '{print $1}')
(( zaehler1++ ))
echo $zaehler1
zaehler2=0
done
fi
if [[ $hilfevorhanden == "1" ]]
then
#if1
if [[ $upsecalt < $upsec && $(($datumjetzt - $upsec)) < $datesecalt ]]
#if2
then
upStundealt=`echo "$upsecalt/3600" | bc`
#Alles planmäßig (mehr oder weniger)
#Wenn das heutige Datum - 23 Stunden kleiner als das alte Datum ist.
if [[ $(($datumjetzt - (23*3600))) < $datesecalt ]]
#if3
then
echo $(date +%d.%m.%Y)" - Das Script wurde vor weniger als 23 Stunden schon einmal auf dem Server "$(hostname)" ausgeführt!"
elif [[ $(($datumjetzt - 25*3600)) > $datesecalt ]]
then
echo $(date +%d.%m.%Y)" - Das Script wurde schon seit mehr als 25 Stunden auf dem Server "$(hostname)" nicht mehr ausgeführt!"
fi
#/if3
RXinMB=$(echo $RXinMB-$RXinMBalt | bc)
TXinMB=$(echo $TXinMB-$TXinMBalt | bc)
upAktuell=$(echo $upStunde-$upStundealt | bc)
RXinMBproTag=`echo "$RXinMB/$upAktuell" | bc`
TXinMBproTag=`echo "$TXinMB/$upAktuell" | bc`
else
#upStundealt>upStunde
if [[ $upStunde>25 ]]
#if4
then
echo $(date +%d.%m.%Y)" - Das Script wurde schon seit mehr als 25 Stunden auf dem Server "$(hostname)" nicht mehr ausgeführt und der Server wurde/ist neu gestartet!"
else
echo "$(date +%d.%m.%Y) - Der Server $(hostname) wurde/ist innerhalb der letzten 25 Stunden neu gestartet!"
fi
#/if4
RXinMBproTag=`echo "$RXinMB/($upStunde/24)" | bc`
TXinMBproTag=`echo "$TXinMB/($upStunde/24)" | bc`
fi
#/if2
else
echo $(date +%d.%m.%Y)" - Datei "$hilfe" existiert nicht oder Variablen aus dieser sind unvollständig!"
if [[ $upStunde>25 ]]
#if5
then
echo $(date +%d.%m.%Y)" - Das Script wurde schon seit mehr als 25 Stunden auf dem Server "$(hostname)" nicht mehr ausgeführt!"
else
echo $(date +%d.%m.%Y)" - Dieser Server läuft seit "$upStunde" Stunde(n)"
fi
#/if5
echo "Der Rechner wurde/ist neu gestartet oder die Datei "$hilfe" wurde (versehentlich) geloescht..."
RXinMBproTag=`echo "$RXinMB/($upStunde/24)" | bc`
TXinMBproTag=`echo "$TXinMB/($upStunde/24)" | bc`
fi
#/if1
echo $upsec":"$RXinMB":"$TXinMB":"$(date +%s)":"$(date +%d.%m.%Y) > $hilfe
echo $(date +%d.%m.%Y)";"$TXinMBproTag";"$RXinMBproTag >> $(hostname).txt
fi
done
echo "======Ende======"
|
|