Eine simple Form des Monitoring prüft per Ping, ob ein bestimmter Rechner im Netz erreichbar ist. Das ist zwar nicht so richtig aussagekräftig, aber als Basis für eine Beurteilung oft schon hilfreich.
Problematisch ist dabei manchmal, dass manche Systeme bekanntermaßen zu bestimmten Zeiten gar nicht antworten. Beliebte Falle sind da etwa Netzwerkdrucker, die abends in einen Energiesparmodus wechseln und dann nicht auf Echo-Anforderungen reagieren. Mit Hilfe von etwas Batch-Magie kann man die Fehlalarme in solchen Situationen deutlich reduzieren. Die gezeigte Technik kann man natürlich auch für andere Zwecke nutzen als nur Ping-Checks.
Wie die meisten Monitoring-Skripte geben auch diese den Errorcode 0 zurück, wenn alles okay ist (also wenn die Rechner auf Ping antworten) und den Wert 1 bei einem Fehler (Ausbleiben der Antwort). Ganz unten gibt es die Skripte zum Download.
Skript 1: Zeitabhängig pingen
Die erste Variante des Skripts erlaubt die Definition von Uhrzeiten, in denen der Check ausgeführt wird. Vorsicht dabei, da ich mich hier rein auf Batch-Mittel beschränke, ist der Code sprachabhängig. Man sollte also immer erst lokal auf dem System testen, von dem der Ping später ausgehen soll, und ggf. die regionalen Ausgaben anpassen.
Dieses Skript kann die wichtigen Parameter auch über die Kommandozeile entgegennehmen. Übergibt man dort nichts, verwendet es die Vorgaben aus dem Code. Beispiel:
- Ping-InTimeRange 10 18 10.10.10.101
Pingt zwischen 10:00 Uhr und 18:59 Uhr den Rechner mit der IP-Adresse 10.10.10.101 an
@echo off rem Ping-InTimeRange.bat rem Script to ping an address only in a specified time range rem By Nils Kaczenski, faq-o-matic.net rem Version 1.0, 2012-02-29 rem Specify default values (may be altered by command line) rem Begin is the first hour of the range (included) rem End is the last hour of the range (included) rem PingAddress may be an IP address or a host name (if name resolution works) rem Example: 10 to 14 means begin at 10:00:00 and end at 14:59:59 rem *** Modify here if needed *** SET Begin=10 SET End=18 SET PingAddress=127.0.0.1 rem *** End modify rem Use command line values if provided IF NOT "%1"=="" SET Begin=%1 IF NOT "%2"=="" SET End=%2 IF NOT "%3"=="" SET PingAddress=%3 rem Uncomment this to display the settings rem ECHO Ping %PingAddress% between %Begin% and %End% rem Split time into tokens for /f "tokens=1-4 delims=.:, " %%i in ("%time%") do ( set hour=%%i set minute=%%j set second=%%k set hundredth=%%l ) rem Initialize check variable rem Check=1 means time is out of range, 0 means within range SET Check=1 rem Check current time against Begin and End IF %hour% GEQ %Begin% ( IF %hour% LEQ %End% SET Check=0 ) IF %Check%==1 ( ECHO Current time %time% is out of range %Begin% to %End%. Will not ping. EXIT /B 0 ) ELSE ( ping -n 1 %PingAddress%>nul )
Skript 2: Tages- und zeitabhängig pingen
Das zweite Skript geht noch einen Schritt weiter. Es führt die Prüfung nur zu den angegebenen Zeiten aus und erlaubt zusätzlich die Angabe von Wochentagen, an denen es nicht prüfen soll. Das ist z.B. nützlich, wenn die Zielsysteme am Wochenende abgeschaltet sind.
Auch hier sind ggf. Anpassungen wegen der Sprachversion des prüfenden Rechners nötig. Anders als das erste Skript nimmt diese Fassung keine Angaben über die Kommandozeile entgegen. Dafür kann man gleich mehrere Prüfungen hineinpacken, indem man gegen Ende des Codes die angegebenen Zeilen kopiert und anpasst. Jede Prüfung besteht hier aus zwei Zeilen (“ping” und Auswertung der Antwort mit “if errorlevel 1”).
@echo off rem Ping-InTimeAndDateRange.bat rem Pings a number of IP addresses only at specified times rem Version 1.1 EN, 2012-03-07 rem Specify default values (may be altered by command line) rem Begin is the first hour of the range (included) rem End is the last hour of the range (included) rem Example: 10 to 14 means begin at 10:00:00 and end at 14:59:59 rem *** Modify here if needed *** SET Begin=7 SET End=18 rem *** End modify rem Split time into tokens for /f "tokens=1-4 delims=.:, " %%i in ("%time%") do ( set hour=%%i set minute=%%j set second=%%k set hundredth=%%l ) rem Get day of week rem see http://www.administrator.de/index.php?content=80546 rem *** Modify here if needed *** rem *** English version - for German systems use "delims=." and "mm=%%b" and "dd=%%a"
FOR /F "tokens=1,2,3 delims=-" %%a in ('echo %date%') do set yy=%%c & set mm=%%a & set dd=%%b
rem *** End modify set /a "TwoDigitYearMax=2038%%1000" if 1%yy% LSS 200 if 1%yy% LSS 1%TwoDigitYearMax% (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100 set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2 set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1 rem *** Modify here if needed *** rem *** set day names according to the system language If %dow% equ 1 set "WoTa=Montag" If %dow% equ 2 set "WoTa=Dienstag" If %dow% equ 3 set "WoTa=Mittwoch" If %dow% equ 4 set "WoTa=Donnerstag" If %dow% equ 5 set "WoTa=Freitag" If %dow% equ 6 set "WoTa=Samstag" If %dow% equ 7 set "WoTa=Sonntag" rem *** End modify rem Initialize check variable rem Check=1 means time is out of range, 0 means within range SET Check=1 rem Check current time against Begin and End IF %hour% GEQ %Begin% ( IF %hour% LEQ %End% SET Check=0 ) rem Check day of week rem *** Modify here if needed *** rem *** set day names according to the system language rem *** set Check=1 to NOT perform the tests on given days IF %WoTa%==Samstag SET Check=1 IF %WoTa%==Sonntag SET Check=1 rem *** End modify rem Initialize error variable SET PingError=0 rem Do the actual ping checks IF %Check%==1 ( ECHO Time %time% on %WoTa% is not between %Begin% and %End%. No tests to do. EXIT /B 0 ) ELSE ( rem *** Modify here if needed *** rem *** copy and modify the lines as needed ping -n 1 10.10.10.101>nul IF ERRORLEVEL 1 (SET PingError=1 & ECHO No reply from SYSTEM NAME!) ping -n 10.10.10.102>nul IF ERRORLEVEL 1 (SET PingError=1 & ECHO No reply from SYSTEM NAME!) rem *** End modify ) IF %PingError%==1 ( ECHO No reply from at least one system. EXIT /B 1 ) ELSE ( ECHO All systems replied correctly. EXIT /B 0 )
Und hier der Download:
Ping-InTimeAndDateRange (1,3 KiB, 1.528-mal heruntergeladen, letzte Änderung am 2. April 2012)
Ping-InTimeRange (841 bytes, 1.438-mal heruntergeladen, letzte Änderung am 2. April 2012)
http://faq-o-matic.net/?p=3946