Zum Inhalt springen

MRTG und SNMP funzen nicht zusammen...


Just2blue4U

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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... :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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



~

~

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...