Just2blue4U Geschrieben 2. November 2004 Teilen Geschrieben 2. November 2004 Ich habe vor, mittels MRTG meinen Fedora Core 1 Rechner zu überwachen. Dafür benötige ich SNMP, was ich bereits instelliert habe und was auch funktioniert: [root@dori root]# snmpwalk -v1 localhost -c public hrSystemNumUsers.0 HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 2 Wenn ich aber nun die gleiche Abfrage mittels mrtg machen möchte: [root@dori mrtg]# vi mrtg.conf.2 # mrtg config file # Automatically generated by the script create_data.pl # WorkDir: /etc/mrtg/ Target[192.168.1.229]: "hrSystemNumUsers.0&hrSystemNumUsers.0:public@localhost" Xsize[192.168.1.229]: 600 Ysize[192.168.1.229]: 200 Ytics[192.168.1.229]: 10 Options[192.168.1.229]: nopercent,gauge,noinfo Title[192.168.1.229]: Number of Logged in Users PageTop[192.168.1.229]: <h1>Number of Logged in Users</h1> MaxBytes[192.168.1.229]: 100 Background[192.168.1.229]: #738AA6 YLegend[192.168.1.229]: # users ShortLegend[192.168.1.229]: LegendI[192.168.1.229]: Users LegendO[192.168.1.229]: Legend1[192.168.1.229]: Number of logged in Users ~ ~ erhalte ich diesen Fehler: [root@dori mrtg]# mrtg /etc/mrtg/mrtg.conf.2 Unknown SNMP var hrSystemNumUsers.0 at /usr/bin/mrtg line 1798 Unknown SNMP var hrSystemNumUsers.0 at /usr/bin/mrtg line 1798 WARNING: Expected a number but got '0:42:31' WARNING: Expected a number but got 'dori' ERROR: Target[portal.aphroland.org.users][_IN_] '" $target->[0]{$mode} "' (warn): Use of uninitialized value in concatenation (.) or string at (eval 6) line 1. ERROR: Target[portal.aphroland.org.users][_OUT_] '" $target->[0]{$mode} "' (warn): Use of uninitialized value in concatenation (.) or string at (eval 7) line 1. WARNING: Skipping Update of portal.aphroland.org.users, inlast is not defined WARNING: Skipping Update of portal.aphroland.org.users, outlast is not defined [root@dori mrtg]# was nun? wie's aussieht funktioniert snmp ganz prächtig, nur mrtg will noch nicht so recht... Wer hat ne ahnung woran das liegen kann? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 4. November 2004 Teilen Geschrieben 4. November 2004 Disclaimer: ich habe noch nie mit SNMP gearbeitet (leider), daher: keine Gewähr Unknown SNMP var hrSystemNumUsers.0 Ich würde sagen, MRTG kennt den Namen hrSystemNumUsers.0 nicht - welcher auch nicht in der Liste (doc/mrtg-mibhelp) steht. Du musst den Identifier selbst angeben. Kannst du den mit snmpwalk -v1 localhost -c public [b]-On[/b] hrSystemNumUsers.0 herausfinden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 4. November 2004 Autor Teilen Geschrieben 4. November 2004 habe deinen Vorschlag ausprobiert und folgendes Ergebnis bekommen: [root@dori mrtg]# snmpwalk -v1 localhost -c public -On hrSystemNumUsers.0 .1.3.6.1.2.1.25.1.5.0 = Gauge32: 3 daraufhin habe ich die mrtg.cfg abgeändert... # mrtg config file # Automatically generated by the script create_data.pl # WorkDir: /etc/mrtg/ Target[userstest]: ".1.3.6.1.2.1.25.1.5.0&.1.3.6.1.2.1.25.1.5.0:public@localhost" Xsize[userstest]: 600 Ysize[userstest]: 200 Ytics[userstest]: 10 Options[userstest]: nopercent,gauge,noinfo Title[userstest]: Number of Logged in Users PageTop[userstest]: <h1>Number of Logged in Users</h1> MaxBytes[userstest]: 100 Background[userstest]: #738AA6 YLegend[userstest]: # users ShortLegend[userstest]: LegendI[userstest]: Users LegendO[userstest]: Legend1[userstest]: Number of logged in Users ... und mrtg damit gestartet: [root@dori mrtg]# mrtg mrtgtest.cfg ERROR: Target[userstest][_IN_] '" $target->[0]{$mode} "' evaluated to ' 3 ' instead of a number ERROR: Target[userstest][_OUT_] '" $target->[0]{$mode} "' evaluated to ' 3 ' instead of a number WARNING: Skipping Update of userstest, inlast is not defined WARNING: Skipping Update of userstest, outlast is not defined [root@dori mrtg]# Leider auch hier nicht das gewünschte Ergebnis... was nun? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 5. November 2004 Teilen Geschrieben 5. November 2004 ERROR: Target[userstest][_IN_] '" $target->[0]{$mode} "' evaluated to ' 3 ' instead of a number ERROR: Target[userstest][_OUT_] '" $target->[0]{$mode} "' evaluated to ' 3 ' instead of a number Leider auch hier nicht das gewünschte Ergebnis... was nun? Das sieht doch schonmal gut aus. Die korrekte Zahl "3" wird zurückgegeben, leider mit Leerzeichen drumherum, so dass MRTG damit nichts anfangen kann. Du kannst nun 2 Sachen machen: 1. statt SNMP direkt über MRTG abzufragen, schreibst du ein Script (Bash oder Perl), dass den SNMP-Befehl ausführt und das Ergebnis formatiert ausgibt. Dieses Script gibst du dann als "Target" an. (siehe MRTG Manual -> Target -> External Script) Das Script muss immer genau 4 Zeilen zurückgeben: Input Output Uptime Machine Name Input und Output wären dann der SNMP-Wert für "Users", Uptime und Machine Name kannst du einfach feststellen (`cat /proc/uptime`, ggf. formatieren und `hostname`). 2. Du schreibst eine Perl-Subroutine, die die Rückgabe " 3 " in eine für MRTG verwertbare Zahl umwandelt (siehe MRTG Manual -> ConversionCode). Dazu erstellst du eine Datei "MyConversions.pl" (in mrtg/bin) mit dem Inhalt sub bla { my $value = shift; if ($value =~ /(\d+)/) { return $1; } else { return undef; } } Nicht getestet! Anschliessend nimmst du diese Global Option in deine .cfg auf: ConversionCode: MyConversions.pl Und erweiterst das Target: Target[userstest]: ".1.3.6.1.2.1.25.1.5.0&.1.3.6.1.2.1.25.1.5.0:public@localhost|bla" Dadurch wird die nicht verwertbare Rückgabe " 3 " an die Subroutine bla weitergegeben; diese prüft, ob darin eine Zahl enthalten ist, und gibt diese zurück. Die Subroutine wird dabei 2x ausgeführt (für In und Out), daher wäre die 1. Möglichkeit von der Performance wahrscheinlich besser. HTH Martin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 8. November 2004 Autor Teilen Geschrieben 8. November 2004 Nachdem ich mir den obigen Ratschlag zu Herzen genommen habe, schrieb ich dieses Script: ################################################################# #### Abfrage der eingeloggten User, Uptime und des Hostnames #### ################################################################# #!/bin/bash snmp_string=$(snmpwalk -v1 localhost -c public hrSystemNumUsers.0) echo $snmp_string a="'$snmp_string'" echo $a echo expr length $a echo $(expr length $a) echo $b exit x=$(($(expr length $snmp_string) -1)) echo $x y=$(expr substr $snmp_string $x 5) echo $y das das "exit" unter "echo $b" steht ist gewollt (eingrenzen von Fehlern). Hier ist meine Idee die hinterm Script steht: - der Rückgabewert von "snmpwalk -v1 localhost -c public hrSystemNumUsers.0" soll in die variable "snmp_string" geschrieben werden - vor und hinter den rückgabewert sollen einfache anführungszeichen geschrieben werden - der neue String wird in var "a" geschrieben - die anzahl der Zeichen von diesem String soll ermittelt werden da das nicht klappte habe ich einige echos mit ins script gepackt. hier erstmal die bildschirmausgabe des Scripts: [root@dori mrtg]# sh users.sh HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3 'HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3' expr length 'HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3' expr: Syntaxfehler was mache ich falsch? das verwirrende ist, wenn ich expr length 'HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3' in die konsole kopiere ud dort direkt ausführe dann bekomme ich brav die anzahl der Zeichen zurück: [root@dori mrtg]# expr length 'HOST-RESOURCES-MIB::hrSystemNumUsers.0 = Gauge32: 3' 51 :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 8. November 2004 Autor Teilen Geschrieben 8. November 2004 hab das Problem nun anders gelöst: ################################################################# #### Abfrage der eingeloggten User, Uptime und des Hostnames #### ################################################################# #!/bin/bash users=$(uptime | cut -d" " -f10) up=$(uptime | cut -d" " -f5) echo $users echo $users echo $up exec hostname das funzt soweit auch bestens, die Frage die sich mir nun stellt: Wofür braucht MRTG die Uptime und den Hostname? In der Grafik werden nur die User angezeigt... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 8. November 2004 Teilen Geschrieben 8. November 2004 Sieht doch schon nicht schlecht aus Der Befehl uptime gibt bei mir allerdings Folgendes zurück: 18:31:30 up 87 days, 8:03, 1 user, load average: 0.00, 0.00, 0.00 Wenn auf deinem System auch die Tage angezeigt werden, kannst du nicht mit dem cut Befehl arbeiten. Ich mache es über cat /proc/uptime, das liefert die uptime in Sekunden, welche sich einfach in Tage, Stunden, Minuten umrechnen lässt. Die Uptime und der Hostname wird auf der Seite mit den Monats- und Jahresstatistiken angezeigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 9. November 2004 Autor Teilen Geschrieben 9. November 2004 hmm... Die Uptime und der Hostname wird auf der Seite mit den Monats- und Jahresstatistiken angezeigt. ... nee, irgendwie nicht... hier mal die Daten die auf meiner mrtg-seite stehen: Number of Logged in Users The statistics were last updated Tuesday, 9 November 2004 at 11:55 `Daily' Graph (5 Minute Average) day Max Users 8.0 Average Users 2.0 Current Users 3.0 `Weekly' Graph (30 Minute Average) week Max Users 6.0 Average Users 2.0 Current Users 6.0 `Monthly' Graph (2 Hour Average) month Max Users 3.0 Average Users 1.0 Current Users 1.0 `Yearly' Graph (1 Day Average) year Max Users 0.0 Average Users 0.0 Current Users 0.0 GREEN ### Number of logged in Users wie du siehst steht da nirgends was von uptime und/oder hostname... ist es für das script wichtig, das es mit tagen, stunden, minuten gefüttert wird? wenn ja, mit welcher syntax muss ich die werte an die cfg geben? users (ist klar) users (ist klar) uptime (in welchem format? TTSSHH?) host (ist klar) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 9. November 2004 Autor Teilen Geschrieben 9. November 2004 External Monitoring Scripts If you want to monitor something which does not provide data via snmp you can use some external program to do the data gathering. The external command must return 4 lines of output: Line 1 current state of the first variable, normally 'incoming bytes count' Line 2 current state of the second variable, normally 'outgoing bytes count' Line 3 string (in any human readable format), telling the uptime of the target. Line 4 string, telling the name of the target. sorry, ich fange grade erst mit MRTG an und ich bin erst jetzt dazu gekommen, mal ins richtige manual zu gucken :floet: wie du siehst habe ich die stelle gefunden an der die benötigten werte stehen. und an welcher stelle host/uptime benötigt werden habe ich nun auch erfahren: Die Zeile "at which time 'dori' had been up for 7 days, 5:08:29" wurde bei meiner erstellten seite nicht eingestellt... so... und nu werd ich ma guggn wie ich den rest einstellen kann/muss... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 10. November 2004 Teilen Geschrieben 10. November 2004 sorry, ich fange grade erst mit MRTG an und ich bin erst jetzt dazu gekommen, mal ins richtige manual zu gucken :floet: Besser ist das Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 10. November 2004 Autor Teilen Geschrieben 10. November 2004 ... und schon wieder steh ich aufm schlauch: in der Crontab habe ich stehen: */5 * * * * /usr/bin/mrtg /etc/mrtg/tmpmemusage.mrtg.cfg 2>&1 > /dev/null Anstatt wie bei allen anderen dort eingetragenen cfg's die Grafiken upzudaten, erhalte ich dann alle 5 min diese nette mail: /etc/mrtg/tmpmemusage.sh: /etc/mrtg/tmpmemusage.sh: cannot execute binary file WARNING: Could not get any data from external command '/etc/mrtg/tmpmemusage.sh' Maybe the external command did not even start. (Illegal seek) was mich verwirrt ist, dass der befehl (direkt in der shell eingegeben) problemlos funzt: [root@dori mrtg]# /usr/bin/mrtg /etc/mrtg/tmpmemusage.mrtg.cfg 2>&1 > /dev/null [root@dori mrtg]# :confused: :confused: :confused: Was nun? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 10. November 2004 Teilen Geschrieben 10. November 2004 Wessen crontab ist das - root? Hast du einen anderen User für MRTG eingerichtet, der nicht über Zugriffsrechte auf das Verzeichnis /etc/mrtg/ verfügt? Funktioniert der Befehl direkt in der Shell wirklich - lass mal die Umleitungen nach /dev/null raus? Wie sieht das Script aus - steht das Sha-Bang (#!/bin/bash) direkt am Anfang? Hat das Script +x Recht? Welche SHELL steht in der crontab? Hast du die Zeile in der crontab mit einem ENTER abgeschlossen? Ansonsten poste bitte mal die entsprechende MRTG .cfg und das Script Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 11. November 2004 Autor Teilen Geschrieben 11. November 2004 das sind jede menge fragen, danke nochmal für deine bemühungen... aaalso: 1.: Die Crontab ist von root, richtig. 2.: Die zugriffsrechte können auch nicht das Problem sein weil die mrtg-cfg die den Fehler verursacht nur eine von vielen anderen ist... 3.: Ja, der Befehl funzt wirklich in der shell: [root@dori just2blue4u]# /usr/bin/mrtg /etc/mrtg/tmpmemusage.mrtg.cfg 2>&1 > /dev/null [root@dori just2blue4u]# [root@dori just2blue4u]# /usr/bin/mrtg /etc/mrtg/tmpmemusage.mrtg.cfg [root@dori just2blue4u]# 4.: (Auszug aus /etc/mrtg/tmpmemusage.sh) ##### Temporären Speicher ermitteln #!/bin/bash ramstring=$(free | grep Mem) swpstring=$(free | grep Swap) 5.: [root@dori mrtg]# ls -l tmpmemusage.sh -rwxrwxrwx 1 root root 504 10. Nov 14:51 tmpmemusage.sh [root@dori mrtg]# 6.: ## Crontab fuer root #################### SHELL=/bin/bash 7.: Jap, der Eintrag ist mit [ENTER] abgeschlossen... 8.: Quelltext tmpmemusage.mrtg.cfg: ##### Temporärer Speicher ##### WorkDir: /var/www/html/stats/ Directory[_]: tmpmem Language: german Xsize[_]: 600 Ysize[_]: 200 Ytics[_]: 10 Target[memory]: `/etc/mrtg/tmpmemusage.sh` MaxBytes[memory]: 100 WithPeak[memory]: ymwd Options[memory]: nobanner,noinfo,integer,gauge,nopercent Unscaled[memory]: ymwd Title[memory]: Ram / Swapnutzung PageTop[memory]: <H1>RAM / Swapnutzung</H1> YLegend[memory]: Auslastung: ShortLegend[memory]: kMG[memory]: % LegendI[memory]: RAM: LegendO[memory]: Swap: Legend1[memory]: % RAM belegt Legend2[memory]: % Swap belegt Legend3[memory]: Legend4[memory]: ~ ~ Quelltext tmpmemusage.sh: ##### Temporären Speicher ermitteln #!/bin/bash ramstring=$(free | grep Mem) swpstring=$(free | grep Swap) ramused=$(echo $ramstring | cut -d" " -f3) #echo $ramused ramtotal=$(echo $ramstring | cut -d" " -f2) #echo $ramtotal echo $((($ramused * 100 / $ramtotal * 100) / 100 )) swpused=$(echo $swpstring | cut -d" " -f3) if [ $swpused -eq "0" ] then echo "0" exit 0 fi #echo $swpused swptotal=$(echo $swpstring | cut -d" " -f2) #echo $swptotal echo $((($swpused * 100 / $swptotal * 100) / 100 )) ~ ~ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 11. November 2004 Teilen Geschrieben 11. November 2004 Ich habe den Fehler reproduzieren können, Schuld ist das Bash Script. Wie sieht das Script aus - steht das Sha-Bang (#!/bin/bash) direkt am Anfang? :mod: So geht es: #!/bin/bash ##### Temporären Speicher ermitteln ramstring=$(free | grep Mem) swpstring=$(free | grep Swap) ramused=$(echo $ramstring | cut -d" " -f3) #echo $ramused ramtotal=$(echo $ramstring | cut -d" " -f2) #echo $ramtotal echo $((($ramused * 100 / $ramtotal * 100) / 100 )) swpused=$(echo $swpstring | cut -d" " -f3) if [ $swpused -eq "0" ] then echo "0" exit 0 fi #echo $swpused swptotal=$(echo $swpstring | cut -d" " -f2) #echo $swptotal echo $((($swpused * 100 / $swptotal * 100) / 100 )) ~ ~ Dann fehlt nur noch der Code, der nach den beiden Zahlen noch uptime + hostname ausgibt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 12. November 2004 Autor Teilen Geschrieben 12. November 2004 Dann fehlt nur noch der Code, der nach den beiden Zahlen noch uptime + hostname ausgibt. Ich lasse mir Hostname und uptime nicht ausgeben, da ich die ganzen MRTGs hübsch verpackt in nem Frameset anzeigen lasse. Wenn die Scripts laufen werde ich die HTML-Seiten dann noch mit CSS "stylen", und dann dürfte das Ergebnis sich zeigen lassen! :mod: Danke für deine Bemühungen! Ich werde das bearbeitete Script bei gelegenheit einbinden und dann melde ich mich wie's aussieht, k? DANKE!!! :hodata Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 12. November 2004 Teilen Geschrieben 12. November 2004 Gern geschehen. Auf das Ergebnis bin ich schon gespannt :marine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 15. November 2004 Autor Teilen Geschrieben 15. November 2004 Wahnsinn... es funzt!!!!! :marine :marine: :uli: :marine :marine Vielen, vielen Dank!!! Ähm- eine kleine Verständnisfrage: Sehe ich das richtig das du nix weiter geändert hast als das #! /bin/bash mit dem ##### Temporären Speicher ermitteln zu tauschen? Wenn ja, warum? :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
_Martin_ Geschrieben 15. November 2004 Teilen Geschrieben 15. November 2004 Ja, das ist das einzige, was ich geändert habe :marine In einer solchen Script-Datei muss immer in der ersten Zeile das Programm stehen, mit dem die Datei ausgeführt wird. Das ist bei Shellscripten eben /bin/bash, oder z.B. bei PERL /usr/bin/perl. Davor steht der Zeichencode #!. Da bei deinem Script diese Angabe fehlte, wusste der vom MRTG abgesetzte Befehl nicht, womit er das Script ausführen sollte. Warum es aus der root Shell heraus trotzdem funktionierte, weiss ich auch nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Just2blue4U Geschrieben 16. November 2004 Autor Teilen Geschrieben 16. November 2004 Warum es aus der root Shell heraus trotzdem funktionierte, weiss ich auch nicht. Davon mal abgesehen, habe ich neben dem Script zur Abfrage des Speichers natürlich auch noch einige andere Scripts in Verbindung mit MRTG in der Crontab. Die funzen alle tadellos, obwohl sie alle mit Kommentaren beginnen, genau wie mein ehemaliges "Sorgenkind": ##### Freien HDD-Speicher ermitteln ##### #! /bin/bash string=$(df | grep /$) ####################################### #### Abfrage der eingeloggten User #### ####################################### #!/bin/bash users=$(who -q | grep \# | sed s/'# Benutzer='//g) Falls du dafür ne Erklärung hast oder wenn du mal nix besseres zu tun hast kannste ja mal gucken wie es dazu kommt, das es bei meinem Speicher-abfrage-script offensichtlich NICHT egal ist ob die erste Zeile mit nem Kommentar beginnt oder mit dem Sha-Bang, während sich MRTG bei allen anderen Scripts nicht drum kümmert ob die erste Zeile nun das Sha-Bang enthält oder ob da n Kommentar ist... Ich finde das jedenfalls echt kurios da 1.: die Scripte alle von MRTG ausgeführt werden, und 2.: der Fehler nur bei dem einen Script (memory) auftrat 3.: der Fehler auch nur dann war, wenn ich den MRTG-Befehl inna crontab hatte! :confused: :confused: :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.