Überwachen ob ein Skript läuft - ausgeführt als geplante Task unter Windows Server 2008
Hallo,
ich muss prüfen, ob eine ein Batch-Skript (cmd.exe) noch läuft.
Das Problem dabei ist, dass ich in einem Batch-Skript (skript1) ein Skript (skript2) eines SW-Herstellers aufrufe, welches sofort mit ERRORLEVEL=0 zurück kommt. Dieser ERRORLEVEL bezieht sich aber nur darauf, dass ein weitetres Skript (skript3) erfolgreich gestartet wurde
Ich muss nun in skript1 abwarten, dass skript3 beendet ist, bevor ich die Verarbeitung fortsetzten kann. (OK, eigentlich startet skript3 noch ein skript4 bevor es sich beendet und ich muss auf das Ende von skript4 warten aber ist hier nicht das Problem)
Bisher (Windows Server 2003) habe ich das ganze in der Form gelöst, dass ich über "tasklist" und den eindeutigen Fenstertitel des skript3 die ProzessID ermittelt habe und in bestimmten Intervallen diese PID abgefragt habe. Ist die PID nicht mehr vorhanden konnte ich meine Verarbeitung fortsetzen.
Nun habe ich das ganze nach Windows Server 2008 portiert und habe folgendes festgestellt.
Starte ich mein Skript per Doppelklick oder per Aufruf aus einer cmd funktioniert alles wie gewünscht.
Nutze ich hingegen eine geplante Task (bzw. at aus der cmd) steht mit "tasklist" der Fenstertitel nicht zur Verfügung.
Hat jemand eine Idee, wie ich das Problem lösen kann?
Die Skripte 2 und 3 kann bzw. will ich eigentlich nicht anpassen, da es sich um Skripte eines SW-Herstellers handelt und ich diese aus Support- und Wartungsgesichtspunkten nur ungerne anfasse.
Der Softwarehersteller weiss grundsätzlich darum, dass die Jobsteuerung an der Stelle nicht optimal gelöst ist, hat aber aktuell kein Interesse dies kurzfristig zu verändern.
Es muss sich also um eine Lösung handeln, die über skript1 abzubilden ist.
Falls jemandem nicht ganz klar ist, wass ich meine. Hier ist ein kleines Beispiel in 2 Skripten:
MeinTest.bat:
MeinTest2.bat:
Starte ich "MeinTest.bat" direkt enthält die Datei "find.tasklist.log" eine Zeile und die Datei "all.tasklist.log" die gesamte Tasklist.
Starte ich "MeinTest.bat" als geplante Task über "at" ist die Datei "find.tasklist.log" leer und die Datei "all.tasklist.log" wieder die gesamte Tasklist, aus der sich dann "orakeln" lässt, dass ein "cmd.exe" Prozess zu "MeinTest2.bat" gehört.
Gruß icsAT
ich muss prüfen, ob eine ein Batch-Skript (cmd.exe) noch läuft.
Das Problem dabei ist, dass ich in einem Batch-Skript (skript1) ein Skript (skript2) eines SW-Herstellers aufrufe, welches sofort mit ERRORLEVEL=0 zurück kommt. Dieser ERRORLEVEL bezieht sich aber nur darauf, dass ein weitetres Skript (skript3) erfolgreich gestartet wurde
Ich muss nun in skript1 abwarten, dass skript3 beendet ist, bevor ich die Verarbeitung fortsetzten kann. (OK, eigentlich startet skript3 noch ein skript4 bevor es sich beendet und ich muss auf das Ende von skript4 warten aber ist hier nicht das Problem)
Bisher (Windows Server 2003) habe ich das ganze in der Form gelöst, dass ich über "tasklist" und den eindeutigen Fenstertitel des skript3 die ProzessID ermittelt habe und in bestimmten Intervallen diese PID abgefragt habe. Ist die PID nicht mehr vorhanden konnte ich meine Verarbeitung fortsetzen.
Nun habe ich das ganze nach Windows Server 2008 portiert und habe folgendes festgestellt.
Starte ich mein Skript per Doppelklick oder per Aufruf aus einer cmd funktioniert alles wie gewünscht.
Nutze ich hingegen eine geplante Task (bzw. at aus der cmd) steht mit "tasklist" der Fenstertitel nicht zur Verfügung.
Hat jemand eine Idee, wie ich das Problem lösen kann?
Die Skripte 2 und 3 kann bzw. will ich eigentlich nicht anpassen, da es sich um Skripte eines SW-Herstellers handelt und ich diese aus Support- und Wartungsgesichtspunkten nur ungerne anfasse.
Der Softwarehersteller weiss grundsätzlich darum, dass die Jobsteuerung an der Stelle nicht optimal gelöst ist, hat aber aktuell kein Interesse dies kurzfristig zu verändern.
Es muss sich also um eine Lösung handeln, die über skript1 abzubilden ist.
Falls jemandem nicht ganz klar ist, wass ich meine. Hier ist ein kleines Beispiel in 2 Skripten:
MeinTest.bat:
start "MeinTest2" "C:\temp\meintest2.bat"
MeinTest2.bat:
tasklist /V /FO TABLE|find "MeinTest2" >C:\temp\find.tasklist.log
tasklist /V /FO TABLE >C:\temp\all.tasklist.log
Starte ich "MeinTest.bat" direkt enthält die Datei "find.tasklist.log" eine Zeile und die Datei "all.tasklist.log" die gesamte Tasklist.
Starte ich "MeinTest.bat" als geplante Task über "at" ist die Datei "find.tasklist.log" leer und die Datei "all.tasklist.log" wieder die gesamte Tasklist, aus der sich dann "orakeln" lässt, dass ein "cmd.exe" Prozess zu "MeinTest2.bat" gehört.
Gruß icsAT
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 207156
Url: https://administrator.de/contentid/207156
Ausgedruckt am: 22.11.2024 um 06:11 Uhr
5 Kommentare
Neuester Kommentar
moin,
das Original benennst Du Um.
Dein 1. Script startet normal Das 2. Script und Wartet auf die Meldung "ScripnameFertig"
Somit belässt Du Dein HerstellerScript und hast es nur Umbenannt.
Gruß Phil
Die Skripte 2 und 3 kann bzw. will ich eigentlich nicht anpassen, da es sich um Skripte eines SW-Herstellers handelt und ich diese aus Support- und Wartungsgesichtspunkten nur ungerne anfasse.
dann baue zu dem "auf das zu wartende Script" ein Gleichnamiges Script@echo off
call "D:\auf das zu wartendende Umbenannte Original Script"
waitfor /si ScripnameFertig 1>nul
Dein 1. Script startet normal Das 2. Script und Wartet auf die Meldung "ScripnameFertig"
@echo off
setlocal
set "LOG=D:\Script 1_Log.txt"
call "D:\Script 1.cmd" || >&2 echo FEHLER! Script 3 konnte nicht gestartet werden. && >>"%log%" echo FEHLER! Script 3 konnte nicht gestartet werden. &&exit /b 1
>>"%log%" echo Script 3 wurde gestartet.
echo Script 3 wurde gestartet.
rem Warte auf SriptEnde
waitfor ScripnameFertig
rem hier geht es nachher weiter.
Somit belässt Du Dein HerstellerScript und hast es nur Umbenannt.
Gruß Phil