icsat
Goto Top

Ü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 face-wink
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

Content-Key: 207156

Url: https://administrator.de/contentid/207156

Printed on: April 26, 2024 at 15:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus May 29, 2013 at 09:03:20 (UTC)
Goto Top
Hi,

ein möglicher Ansatz (ungetestet) wäre evtl, dass du Abfragst, ob der entsprechende geplante Task gerade aktiv ist und welchen Status er hat.

Grüße
Member: pieh-ejdsch
pieh-ejdsch May 29, 2013, updated at May 30, 2013 at 10:23:34 (UTC)
Goto Top
moin,

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
das Original benennst Du Um.

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
Member: icsat
icsat May 29, 2013 at 09:54:32 (UTC)
Goto Top
Hi certifiedit,

das funktioniert leider nicht oder ich habe dich falsch verstanden.

Mein Skript1 läuft als geplante Task. Wenn ich die Task abfragen würde wäre sie natürlich da und aktiv. Ich muss aber wissen was mit skript3 ist.

Gruß icsAT
Member: icsat
icsat May 29, 2013 at 10:05:10 (UTC)
Goto Top
Hey Phil,

danke für den Ansatz. Waitfor war mir bisher nicht bekannt.
Liegt vermutlich daran, das mir die 2008 er Kiste gerade erst vor die Nase gestellt wurde face-wink
Werde mit dem Ansatz später mal etwas testen.

Gruß icsAT
Member: icsat
icsat May 30, 2013 updated at 07:41:49 (UTC)
Goto Top
Moin Moin,

ich habe das Problem zwischenzeitlich gelöst.

Danke noch mal an Phil, dessen Ansatz mich dazu bewegt hat die Dinge noch einmal anders zu betrachten.

Ich hatte mich allerdings doch gegen "WAITFOR" entschieden, da ich auch noch einen 2003er Testserver habe auf dem "WAITFOR" natürlich nicht vorhanden ist und ich ganz gerne auf allen Systemen die gleichen Skripte laufen habe. Ich wollte es dann, angelehnt an Phil's Vorschlag, alternativ mit einer Datei lösen, deren vorhanden sein oder nicht vorhanden sein ich in skript1 abfrage.

Gelöst habe ich es dann aber doch noch wieder anders. Das hat aber eigentlich nichts mehr mit meiner Fragestellung zu tun.
Ich habe mir die Skripte des SW-Herstellers noch einmal genauer angesehen und festgestellt, dass skript3 sehr wohl auf skript4 warten kann, wenn bestimmte Umgebungsvariablen gesetzt sind. Schade, dass mir die Hersteller Hotline das nicht sagen konnte. Weiter habe ich festgestellt, dass skript2 "nur" prüft ob bestimmte Umgebungsvarieblen korrekt gesetzt sind und theoretisch mehrere Instanzen von skript3 startet. (Theoretisch, weil es bei uns immer nur eine ist).
Daher übergehe ich jetzt skript2 und starte skript3 direkt aus skript1 und warte auf dessen Beendigung, welche dank der gesetzten Umgebungsvariablen erst nach Beendigung von skript4 erfolgt.
Das ist zwar nicht im Sinne des Erfinders (Softwareherstellers) aber was solls.

Gruß icsAT