pollekowski
Goto Top

Ausführung sekundengenau mit For Schleife mgl?

Ziel ist ein "Ping -n 1" alle 10 Sekunden auszuführen und das Ergebniss in ein Log zu schreiben

Hallo Ihr Halbgötter des Scriptings!

Ich suche eine Möglichkeit einen Ping Befehl immer genau zu einem bestimmten Zeitpunkt zu starten. Das Script soll den ganzen Tag von 00:00:00 Uhr bis 23:59:59 Uhr laufen und alle 10 Sekunden einen Ping losjagen und das Ergebnis in ein Log schreiben.

Das Script ist im Prinzip schon fertig und funktionstüchtig, allerdings macht mir dabei der Zeitfaktor große Probleme. Teilweise wird der Ping mehrfach in einer Sekunde ausgeführt oder er überspringt mal 10 Sekunden. Abgesehen davon ist das ganze mit einer hässlichen "IF %second% EQU 00 GOTO RUNPING" Schleife gemacht, die solange durchläuft bis einmal ein Treffer gelandet wird und der Ping ausgeführt. Das verursacht enorme CPU Last.

Lange Rede kurzer Sinn. Mein Logfile soll am Ende etwa so aussehen: (Wobei -100 einem Timeout gleich kommt)

Uhrzeit; Latency
16:59:10; 13
16:59:20; 14
16:59:30; 14
16:59:40; 13
16:59:50; 17
17:00:00; -100

Jetzt suche ich halt eine Möglichkeit den Folgenden Pseudocode in eine reine und saubere Batchform zu pressen.
SET HOST=193.99.144.80        // via UserEingabe
SET second=%Time:~6,2%        // macht aus 17:59:06,89 -> 06 (nur die Sekunden)

:START

wenn %second% EQU 00 oder 10 oder 20 oder 30 oder 40 oder 50 ist, dann "ping %HOST% -n 1 > %tmp%"  

GOTO START

Ich hoffe ihr versteht was ich will und noch mehr hoffe ich, dass auch jemand ne tolle Idee hat wie ich das ganze umsetzen kann.

Content-ID: 127737

Url: https://administrator.de/forum/ausfuehrung-sekundengenau-mit-for-schleife-mgl-127737.html

Ausgedruckt am: 22.12.2024 um 21:12 Uhr

60730
60730 22.10.2009 um 18:38:19 Uhr
Goto Top
Servus,

ich hab zwar heute ein weißes Hemderl an - aber ob deshalb die Buchstaben vorm Gott auch für mich gelten?


:start
Ping -n 9 localhost
ping -n 1 193.99.144.80 >> %tmp%"   
goto start

für die Skizze bestimmt nicht face-wink

Gruß


edit:

Biber unser Vollgott nicht nur für einzeiler hätte an deinem Beispiel mit dem Logfile - seine größte Freude face-wink
filippg
filippg 22.10.2009 um 19:06:15 Uhr
Goto Top
Hallo,

im Taskplaner (Scheduled Tasks) kann man unter den erweiterten Einstellungen angeben, dass ein Task alle x Sekunden ausgefürt werden soll. Könnte das eine Lösung für dich sein?

Gruß

Filipp
Pollekowski
Pollekowski 22.10.2009 um 20:58:17 Uhr
Goto Top
Leider nicht genau genug, es soll der Ping immer genau auf die Sekunde ausgeführt werden...
Das hat den Sinn, dass das Script in mehrfacher Ausführung parallel läuft und mindestens 12 VPN Verbindungen überwachen soll. Am Ende wird das ganze grafisch als HTML Diagramm dargestellt. Da sollte das alles schon genau und gleichförmig aussehen bei 8640 Pings pro Tag und überwachter Verbindung.

Ping localhost ist zu ungenau, da würd ich lieber auf wait.exe setzen.
Dumm ist aber, dass der Ping je nach Laufzeit unterschiedlich lange brauch um zu antworten. Bzw. Timeouts sind auch unberechenbar. So in der Art habe ich es mit Wait.exe grad umgesetzt, doch hin und wieder überspringt er mal 10 Sekunden face-sad

Es soll also immer genau in der 00 / 10 / 20 / 30 / 40 / 50 Sekunde gestartet werden.

Und ich hoffe Biber schaut hier noch vorbei und ich wecke seine Neugier face-smile
Pollekowski
Pollekowski 22.10.2009 um 21:00:45 Uhr
Goto Top
Da mehrere Instanzen dieses Scripts parallel laufen werden und die Scripts den ganzen Tag als Schleife laufen ist das keine echte Option. Sry.

Um Euch mal zu verdeutlichen was ich schon hab (aber nicht will), hier mal ein Auszug:
[Zeile 30-38 laufen ja nach Host bis zu 30 mal pro Sekunde durch und fressen sinnlos & massiv CPU Leistung]

@ECHO ON & setlocal EnableDelayedExpansion 
@ECHO.
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO :::::::::: Variablen die angepasst werden muessen ::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO :::: Die Laenge der IP muss mit Punkten gezaehlt werden ::::
@ECHO ::::::::::: 10.64.0.1 = 9 / 193.231.155.133 = 15 :::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO.
SET HOST=193.99.144.80
SET IPLAENGE=13
@ECHO.
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO ::::::::::: Variablen die NICHT angepasst werden :::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO.
cls
SET tmp=%HOST%\%HOST%.tmp
SET tmp2=%HOST%\%HOST%.tmp2
SET timestamp=%Date%; %Time:~0,8%;
SET log=%HOST%-%Date%.log
SET STARTDATE=%DATE:~0,2%
SET /A ENDDATE=%STARTDATE%+1 
SET /A EINRUECKUNG=28+%IPLAENGE%

MD %HOST%
DEL %tmp%
DEL %tmp2%

:CHKSECOND
SET second=%Time:~6,2%
IF %second% EQU 00 GOTO RUNPING
IF %second% EQU 10 GOTO RUNPING
IF %second% EQU 20 GOTO RUNPING
IF %second% EQU 30 GOTO RUNPING
IF %second% EQU 40 GOTO RUNPING
IF %second% EQU 50 GOTO RUNPING
GOTO CHKSECOND

:RUNPING
SET timestamp=%Time:~0,8%;
ping %HOST% -n 1 -w 5000 > %tmp%

SET MYERRORLVL=99
findstr "TTL=" %tmp%  
SET MYERRORLVL=%ERRORLEVEL%
If %MYERRORLVL% EQU 0 (
	findstr "TTL=" %tmp% > %tmp2%  
	GOTO :AUSGABE
	)

Echo Antwort von %HOST%: Bytes=32 Zeit=-100ms TTL=999> %tmp2%

:AUSGABE
set /p ausgabe=< %tmp2%
echo %timestamp% %ausgabe:~41,-10% >> %log%

If %STARTDATE% EQU %ENDDATE% GOTO END
If %second% EQU %Time:~6,2% GOTO WAIT

GOTO CHKSECOND

:WAIT
WAIT.EXE 9500
GOTO CHKSECOND

:END
REM Hier wird das LOG via BLAT.EXE versendet
REM Hier wird das LOG via FTP auf den Server geladen
EXIT

In Verbindung mit Wait.exe läuft das zwar aber nicht sauber genug, gerade wenn 20 Instanzen parallel laufen.

Ausgabe ist:

21:33:00; 51
21:33:10; 64
21:33:20; 56
21:33:30; 47
21:33:40; 46
21:33:50; 46
21:34:00; 47
21:34:10; 47
21:34:20; -100
21:34:30; -100
21:34:40; -100
21:34:50; -100
21:35:00; -100
21:35:10; -100
21:35:20; -100
21:35:30; 50
21:35:40; 61
21:35:50; 47
21:36:00; 55

Das wird dann von PHP visualisiert (X = Uhrzeit Y = Latency).

Hoffe jetzt habt Ihr ne gewisse Vorstellung von dem was ich will.
60730
60730 23.10.2009 um 01:03:10 Uhr
Goto Top
Servus,

Warum du dir "soviel" Mühe machst (und dann mit den Mitteln) hab ich zwar immer noch nicht verstanden...

Aber anstatt mühsam mit %Time:~6,2% set & 10,20,usw rumzuhantieren...

:start
@if not "%Time:~7,1%" == "0" @ping -n 2 127.0.0.1>nul  
@if "%Time:~7,3%" == "0,0" @title %Time:~7,3% && ping host>>host.log  
@goto start
kostet der Weg kaum Saft...

btw: Du weißt aber schon, welche Datenmenge mit 5.000er Testpaketen alle 10 sekunden zusätzlich auf die Leitung kommen...

Ich würde - wenn überhaupt mit "den" Mitteln - immer via Telnet von einem Switch zum anderen "pingen" - wenn überhaupt....


Gruß
Pollekowski
Pollekowski 23.10.2009 um 10:34:39 Uhr
Goto Top
Es soll halt einfach und universal einsetzbar sein. Zu Diagnosezwecken werden wir beim Kunden mal eine Woche lang die VPN Verbindungen testen und grafisch auswerten. soll ja kein Dauerzustand sein. Und mittels Batch kann ich das Script auf jedem Windows Server / client laufen lassen ohne groß Nagios oder Whatsup zu installieren.

Also sozusagen die Protable NetzMonitoring SW zur Diagnoseface-smile

Deine Idee mit dem "IF Time xx == 0" hat mich erstmal dazu veranlasst dreimal mit dem Kopf auf den Schreibtisch zu schlagen face-smile. Das ich da nicht drauf gekommen bin....

Das ganze jetzt wunderbar gekürzt und auch recht performant.

@ECHO OFF & setlocal EnableDelayedExpansion 
@ECHO.
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO :::::::::: Variablen die angepasst werden muessen ::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO.
SET HOST=193.99.144.80
@ECHO.
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO ::::::::::: Variablen die NICHT angepasst werden :::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO.
cls
SET tmp=%HOST%\%HOST%.tmp
SET tmp2=%HOST%\%HOST%.tmp2
SET timestamp=%Date%; %Time:~0,8%;
SET log=%HOST%-%Date%.log
SET STARTDATE=%DATE:~0,2%
SET /A ENDDATE=%STARTDATE%+1 
SET TMPHOST=%HOST%
SET IPLAENGE=0
MD %HOST%
DEL %tmp%
DEL %tmp2%
cls
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO ::::::::::: Pingtest auf %HOST% laeuft ::::::::::::
@ECHO ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ECHO.

:CHKLENGTH
if defined TMPHOST (set TMPHOST=%TMPHOST:~1%&set /A IPLAENGE += 1&GOTO CHKLENGTH)
SET /A EINRUECKUNG=28+%IPLAENGE%

:CHKSECOND
if %Time:~7,1% EQU 0 GOTO RUNPING
WAIT.EXE 666
GOTO CHKSECOND

:RUNPING
SET timestamp=%Time:~0,8%;
ping %HOST% -n 1 -w 5000 > %tmp%

findstr "TTL=" %tmp%  
If %ERRORLEVEL% EQU 0 findstr "TTL=" %tmp% > %tmp2%  
If %ERRORLEVEL% EQU 0 GOTO :AUSGABE

Echo Antwort von %HOST%: Bytes=32 Zeit=-100ms TTL=999> %tmp2%
	
:AUSGABE
set /p ausgabe=< %tmp2%
echo %timestamp% %ausgabe:~41,-10% >> %log%
If %STARTDATE% EQU %ENDDATE% GOTO END
WAIT.EXE 5000
GOTO CHKSECOND

:END
DEL %tmp%
DEL %tmp2%
RD %HOST% /Q /S

REM Hier wird das LOG via BLAT.EXE versendet
REM Hier wird das LOG via FTP auf den Server geladen

EXIT
60730
60730 23.10.2009 um 11:46:41 Uhr
Goto Top
Zitat von @Pollekowski:
/snip
Deine Idee mit dem "IF Time xx == 0" hat mich erstmal dazu
veranlasst dreimal mit dem Kopf auf den Schreibtisch zu schlagen face-smile.
Das ich da nicht drauf gekommen bin....

face-wink Das du da noch drauf gekommen bist - nachdem dein Kopf dreimal gegen den Tisch gekommen ist.. face-smile
der arme Tisch hats hoffentlich überlebt face-wink face-wink

Das ganze jetzt wunderbar gekürzt und auch recht performant.

Und als Gegenlob mal klipp und klar:
  • freut mich - dir geholfen zu haben und dass du einen wirklich Aussagekräftigen Titel für dein Problem gewählt hast.

"So" sollten die Threads alle sein - kurz, prägnant, nix dabei vergessen und so formuliert, dass später auch ein anderer was davon hat face-wink

umademyday

Gruß