• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Servercheck über automatische Ping abfrage

Hallo,

ich habe mich jetzt durch diverse internetseiten, welche google ausgespuckt hat durchgewühlt und leider nix passendes gefunden.

da unser server andauernd abstürzt würde ich gerne mithilfe einer ping-abfrage kontrollieren, wann und wie oft dieser abstürzt.

dies sollte ungefähr so aussehen, dass die IP/URL die angepingt wird angezeigt wird, die aktuelle zeit, und z.b. Server OFFLINE.

bsp:
www.beispieldomain.de - Server OFFLINE - 29.12.2007 14:07

desweiteren sollte man einstellen können in welchem intervall er die abfrage tätigt, beispielsweise 1mal in der minute.

die auswertung soll dann in ein textdokument gespeichert werden, welches ich dann unter meinerdomain.de/servercheck.txt abrufen kann. Also nur ein Beispiel.

dies hab ich aus selfhtml.org:

Code:
exec("ping -c 4 -s 65 www.yahoo.com", $list);
$test = explode("/",substr($list[count($list)-1],32));
print $test[1]."\n"; // 0=min 1=avg 2=max 3=stddev

füge ich das aber über phpmyadmin unter sql ein kommt immer error.

stimmt an dem code was nicht, bzw. erfüllt dieser überhaupt meine wünsche?

kenn mich leider nicht wirklich mit php aus von daher wäre ich froh wenn mir einer kleine tipps geben könnte, bzw. mir n anfangsscript schreiben kann, dass selbst ein laie wie ich kapiert.

danke schon mal im voraus!

smoke
 
währe eventuell Nagios etwas für dich?

kleiner Ausschnitt aus der /var/log/nagios.log:

Code:
[1198882800] CURRENT HOST STATE: WILD-THING;UP;HARD;1;PING OK - Packet loss = 0%
, RTA = 0.04 ms
[1198882800] CURRENT SERVICE STATE: Netgear_RP614v2;Gateway;OK;HARD;1;PING OK -
Packet loss = 0%, RTA = 0.29 ms
[1198882800] CURRENT SERVICE STATE: WILD-THING;Apache2;OK;HARD;1;HTTP OK HTTP/1.
1 200 OK - 306 bytes in 0.000 seconds
[1198882800] CURRENT SERVICE STATE: WILD-THING;LAN;OK;HARD;1;PING OK - Packet lo
ss = 0%, RTA = 0.04 ms
[1198882800] CURRENT SERVICE STATE: WILD-THING;Load;OK;HARD;1;OK - load average:
 2.10, 2.28, 2.47
[1198882800] CURRENT SERVICE STATE: WILD-THING;MySQL;OK;HARD;1;Uptime: 12634  Th
reads: 1  Questions: 42  Slow queries: 0  Opens: 12  Flush tables: 1  Open table
s: 6  Queries per second avg: 0.003
[1198882800] CURRENT SERVICE STATE: WILD-THING;Partition;OK;HARD;1;DISK OK - fre
e space: / 24494 MB (77% inode=93%):
[1198882800] CURRENT SERVICE STATE: WILD-THING;Processes;OK;HARD;1;PROCS OK: 63
processes with STATE = RSZDT
[1198882800] CURRENT SERVICE STATE: WILD-THING;SWAP;OK;HARD;1;SWAP OK - 100% fre
e (2055 MB out of 2055 MB)
[1198882800] CURRENT SERVICE STATE: WILD-THING;Users;OK;HARD;1;USERS OK - 6 user
s currently logged in

Dabei gibt es unter:
Code:
/usr/lib/nagios/plugins
Beispielsweise diverse Scripte wie das Kommando chek_ping.

Dieses usage sieht so aus:
Code:
Usage:check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>%
 [-p packets] [-t timeout] [-4|-6]

Und die Ausgabe könnte dann so aussehen:
Code:
wild-thing:/usr/lib/nagios/plugins # ./check_ping -H 192.168.0.1 -w 100.0,20% -c 500.0,60% -p 5
PING OK - Packet loss = 0%, RTA = 0.25 ms

check_ping verwendet meines Wissens nach das normale Ping utility.

Gruß

R
 
nagios wäre super! kann sogar um einiges mehr als ich erwarte soweit ich das jetzt gelesen habe, kann man die abfragen auch anzeigen, ohne das man sich über das webinterface einloggt?

ist aber fast zu aufwendig! - mir würde ein normales script reichen, welches mir in einer textdatei den ping auswertet!
 
Wobei die Schalter:
Code:
-w 100.0,20% -c 500.0,60% -p 5

w und c ist schwellwert für Warnung und Critical. Und P ist Paketanzahl?

Gruß

R
 
revealed schrieb:
Dabei gibt es unter:
Code:
/usr/lib/nagios/plugins
Beispielsweise diverse Scripte wie das Kommando chek_ping.

Dieses usage sieht so aus:
Code:
Usage:check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>%
 [-p packets] [-t timeout] [-4|-6]

Und die Ausgabe könnte dann so aussehen:
Code:
wild-thing:/usr/lib/nagios/plugins # ./check_ping -H 192.168.0.1 -w 100.0,20% -c 500.0,60% -p 5
PING OK - Packet loss = 0%, RTA = 0.25 ms

check_ping verwendet meines Wissens nach das normale Ping utility.

Gruß

R

das script alleine würd mir reichen, weil das is n kleiner popelliger v-server und der glaub ich pakt das nagios net bzw. wär dann voll ausgelastet.
 
Code:
das script alleine würd mir reichen, weil das is n kleiner popelliger v-server und der glaub ich pakt das nagios net bzw. wär dann voll ausgelastet.
Ich meinte eher in der art eventuell genügt die Usage des utility check_ping. Mit beispielsweise weiterleitung der Ausgabe in eine Textdatei. Dazu müsstest du nicht die ganze nagios betreiben.

Also so beispielsweise als Cronjob?:
Code:
wild-thing:/usr/lib/nagios/plugins # ./check_ping -H 192.168.0.1 -w 100.0,20% -c 500.0,60% -p 5 > /tmp/test.txt && cat /tmp/test.txt
PING OK - Packet loss = 0%, RTA = 0.25 ms
Wenn s das immernoch nicht trifft, dann kenn ich mich mit PHP leider trotzdem nicht aus. Also währe nur eine Idee.

Gruß

R
 
also das wäre schon super aber ich will halt eigtl. das ohne nagios. ich war da mal in nem linux club bei uns in der stadt und da ham wir genau das mit php gemacht aber ich weis nich mehr wies geht...
hab auch jetzt schon n paar von den "alten kursteilnehmern" angeschrieben aber die machen seitdem gar nix mehr mit linux von daher siehts schlecht aus.
deine variante funktioniert 100pro, wills aber mit php machen.

nix für ungut - trotzdem danke für hilfe - und mit php hast du gar keine ahnung?
ansonsten würd ichs ja selbst schreiben, wenn ichs könnte.

muss eigtl. ne ganz simple anwendung sein
Ping host --> if Ping is OK - no action --> else write <host> <date, clock> <OFFLINE>

und das ganze jetzt nur noch in der richtigen sprache schreiben dann müsste es gehen.
 
Du meinst eine Abfrage?
Code:
#!/bin/sh
##Ob eine Antwort in form eines Paketes vom Pingbefehl erhalten wurde?
VAR="$( "ping 192.168.0.1 -c 1 |grep received | awk -F \, '{print $2}'" )";
# auf das Leerzeichen Achten?
Wert="$(" 1 received")";
#
# Abfrage ob die Bedingung zutrifft und Aktion:
if [ "$VAR" = "$Wert" ]; then
  echo "Server Up" > /tmp/test.txt;
else
  echo "Server Down" > /tmp/test.txt;
fi;
#
exit 0
# EOF

Gruß

R
 
naja wenn du halt mit ping 1 ping absetzt also:
Code:
ping 192.168.0.1 -c 1
dann bekommst du eine massive Ausgabe wie diese:
Code:
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=250 time=0.240 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.240/0.240/0.240/0.000 ms
Diese könntest du beispielsweise mit grep und awk etwas eingrenzen?

Und dann in die Schleife einbauen.

Und dann sagen:

else echo $var > /tmp/test.txt

hmm noch nicht ganz..

Code:
ping 192.168.0.4 -c 1 |grep received | awk -F \, '{print $2}'
 0 received
ping 192.168.0.1 -c 1 |grep received | awk -F \, '{print $2}'
 1 received


Gruß

R
 
Hi,
ich habe mal so etwas für die Arbeit erstellt. Schau mal auf meiner Seite "www.linux-specialist.com" im Download Bereich vorbei. Dort gibt es KNetMon zum downloaden. Man kann einstellen, in welchen Intervallen gepingt werden soll und alles "online / offline" wird in einer Logdatei mitgeplottet. Benachrichtigung via Mail ist auch möglich. Also schau mal vorbei und vielleicht ist das ja genau das, was Du suchst.
 
d.h. der code sieht dann so aus:

Code:
 # 
VAR="$( "ping <host>")"; 
Wert="$("1 received")"; 
# 
# Abfrage ob die Bedingung zutrifft 
if [ "$VAR" = "$Wert" ]; then 
  ; 
else 
  echo "Server Down > /tmp/test.txt"; 
fi; 
# 
exit 0 
# EOF

also so müsste er doch jetzt wenn Wert 0 is in die textdatei Server down schreiben, mit uhrzeit + datum???

andersrum müsste das doch dann gehen:

Code:
# 
VAR="$( "ping <host>" )"; 
Wert="$("1 received")"; 
# 
# Abfrage ob die Bedingung zutrifft 
if [ "$VAR" = "$Wert" ]; then 
  echo "Server Up > /tmp/test.txt"; 
else 
  ; 
fi; 
# 
exit 0 
# EOF

und jetzt noch wie kann ich das intervall in dem er abfrägt ändern, z.b. im 60 sek takt oder 2 min takt das muss man doch auch einstellen können.

ansonsten is das genau das was ich mein!!! Super!!!
 
Die $ Wert war verplant und die syntax der Zeile mit VAR:
Code:
#!/bin/sh
##Ob eine Antwort in form eines Paketes vom Pingbefehl erhalten wurde?
VAR="$( ping 192.168.0.1 -c 1 |grep received | awk -F \, '{print $2}' )";
#
# Abfrage ob die Bedingung zutrifft und Aktion
# auf das Leerzeichen Achten vor der 1?
if [ "$VAR" = " 1 received" ]; then
  echo "Server Up" > /tmp/test.txt;
else
  echo "Server Down" > /tmp/test.txt;
fi;
#
exit 0
# EOF

Hmm....:
-i interval
Wait interval seconds between sending each packet. The default is to wait for one second between each packet normally, or not to wait in flood mode. Only super-user may set interval to values less 0.2 econds.

Könnte das damit klappen? Kann man das auf Minuten oder Stunden tunen?

kannst du das nicht von Cron alle 5 Minuten ausführen lassen und nur die TXT abgreifen?

Weiter weiss ich nicht, sorry. mit -i ergibt eine ganz andere Ausgabe..

Gruß

R
 
revealed schrieb:
Hmm....:
-i interval
Wait interval seconds between sending each packet. The default is to wait for one second between each packet normally, or not to wait in flood mode. Only super-user may set interval to values less 0.2 econds.

ja das müsste eigtl. mit dem gehen - zum testen können wirs ja mal auf 60 setzen - dann müsste es doch eigtl. im minutentakt ne abfrage starten.

das andere du fängst mit !bin/sh an - is das dann n cronjob? bzw. dann kann ichs ja nicht mehr mit php machen - was mir jetzt eigtl. auch egal wäre. hauptsache ich verstehe das script.
 
das sollte ein Shellscript sein. Diesen kannst du normalerweise von Cron ausführen lassen, beispielsweise.

Gruß

R
 
also ich kanns einfach net starten, bin wahrscheinlich der größte linux noob ever, aber ich will das jetzt schaffen.

ich hab das ganze in ne textdatei mit dem namen servercheck.txt unter /home/extern gelegt

also mit konsole -> cd /home/extern
-> exec servercheck.txt

konsole bzw. putty geht zu!

dann hab ichs noch über phpmyadmin probiert:

shell_exec('/home/extern/servercheck.txt start'

da bringt er mir dann immer ne fehlermeldung:
Code:
SQL-Befehl: 

shell_exec(

'/home/extern/servercheck.txt start' 

MySQL meldet:  

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'shell_exec('/home/extern/servercheck.txt start'' at line 1

verflucht ey... das gibts einfach net - das einfachste script und es klappt nicht.
 
also ich würd mit putty connecten und:

Code:
#datei erstellen:
touch pingcheck.sh
# mit pico öffnen und Text einfügen speichern, schliessen:
pico pingcheck.sh
# ausführbar machen:
chmod +x pingcheck.sh
# ausführen
sh pingcheck.sh
# ausgabe überprüfen
cat /tmp/test.txt

Du brauchst natürlich Schreibberechtigung auf "/tmp/"

beispiel:
Code:
# als SU: Mit einer vergebenen IP:
wild-thing:/home/disk/Desktop # sh check_ping_thing.sh
wild-thing:/home/disk/Desktop # cat /tmp/test.txt
Server Up
# als SU: Mit einer nicht vergebenen IP:
wild-thing:/home/disk/Desktop # pico check_ping_thing.sh
wild-thing:/home/disk/Desktop # sh check_ping_thing.sh
wild-thing:/home/disk/Desktop # cat /tmp/test.txt
Server Down
wild-thing:/home/disk/Desktop #


Gruß

R
 
jaaaa es hat geklappt - es ist ausgeführt worden - datei unter temp is auch vorhanden - allerdings steht da jetzt nur drin:

Code:
Server Down!

ähm, ja jetzt muss ma noch das mit datum und host rein editieren - und das mit dem intervall noch testen - aber das probier ich morgen. du bist ja hoffentlich morgen auch da?!?!

danke für die tatkräftige unterstützung - wäre alleine bestimmt nicht soweit gekommen.

noch nen schönen abend

lg
smoke
 
wild-thing:/home/disk/Desktop # sh check_ping_thing.sh
wild-thing:/home/disk/Desktop # cat /tmp/test.txt
wild-thing Up! last check was on: Sa 29. Dez 20:07:06 CET 2007

Code:
#!/bin/sh
## Ob eine Antwort in form eines Paketes vom Pingbefehl erhalten wurde?
# variable für den Befehl "date"
date="$( date )";
# variable für den Befehl "hostname"
hostname="$( hostname )";
# variable für den Speicherort und name der Datei
path="/tmp/test.txt";
# vaiable für IP Adresse:
ip="192.168.0.1";
#
## Der befehl und kürzung auf gewünschte Ausgabe:
VAR="$( ping $ip -c 1 |grep received | awk -F \, '{print $2}' )";
# Abfrage ob die Bedingung zutrifft und Aktion
# (auf das Leerzeichen Achten vor der 1?)
if [ "$VAR" = " 1 received" ]; then
  echo "$hostname Up! last check was on: $date" > $path;
else
  echo "$hostname Down! last check was on: $date" > $path;
fi;
#
exit 0
# EOF

hostname liest halt den Hostname vom Server auf dem es ausgeführt wird. Also nicht auf dem Zielrechner Eigendlich reichlich sinnlos, weil den weisst du ja bestimmt?

Gruß

R
 
funktioniert einwandfrei!!!

das einzige, wenn er die prüfung ausführt überschreibt er jedes mal die alte prüfung.

eigtl. sollte es so aussehen:

Code:
Server OFFLINE - Letzte Prüfung am: Sun Dec 30 00:55:14 CET 2007
Server OFFLINE - Letzte Prüfung am: Sun Dec 30 00:56:14 CET 2007
Server OFFLINE - Letzte Prüfung am: Sun Dec 30 00:57:14 CET 2007
Server OFFLINE - Letzte Prüfung am: Sun Dec 30 00:58:14 CET 2007
Server OFFLINE - Letzte Prüfung am: Sun Dec 30 00:59:14 CET 2007
....

wie du bereits gesagt hast, ist die hostname abfrage sinnlos, da ich natürlich die IP meines servers weis. Allerdings wäre noch schön wenn man ne Variable einbauen könnte, z.b. Server "Domain/IP" OFFLINE/ONLINE - Letzte...." und dabei Domain/IP variable is, sprich die IP des überprüften servers angezeigt wird.

lg smoke
 
Oben