b-real
Goto Top

Per Batch prüfen ob Programm länger als 5 Min. läuft, wenn ja schliessen

Hallo Community,

ich möchte per Batch auf einem Windows 7 x86 PC prüfen, ob das Programm WinSCP.exe länger als 5 Minuten läuft. Wenn ja soll der Prozess beendet werden, zB mit taskkill. Ein Neustarten von WinSCP.exe ist nicht notwendig, das geschieht ohnehin mit einem anderen Task.

Hintergrund: Alle 15 Minuten läuft ein Batch Programm im Hintergrund (in der Aufgabenplanung als Task definiert), das wiederum einige weitere Batch Programme der Reihe nach aufruft. In einem dieser Batch Programme wird das Programm WinSCP.exe mit definierten Parametern gestartet. WinSCP holt dann von einem FTP Server Daten ab, falls vorhanden.
Letztens ist es aber vorgekommen dass WinSCP mit der Logfile-Meldung "Fehler beim Anzeigen des Verzeichnisses" hängen geblieben ist und dadurch die Batch Verarbeitung ewig stehen geblieben ist, was mir natürlich erst später aufgefallen ist. WinSCP sollte normalerweise nicht länger als 20-30 Sekunden brauchen um die Daten vom FTP Server abzuholen.

Mit der Suche bin ich auf ein Posting von User bastla gestossen, mit diesem Batch-Befehl kann die Process ID (PID) von WinSCP ausgelesen werden:

for /f "tokens=2" %%i in ('tasklist^|findstr /b "WinSCP.exe"') do set "PID=%%i"  

Somit habe ich die PID, aber wie kann ich per Batch prüfen ob die selbe PID in 5 Minuten immer noch läuft und falls ja den Prozess automatisch beenden? WinSCP wird nur einmal gestartet, es gibt also keine mehrfachen Instanzen mit verschiedenen PIDs.

Danke für eure Ratschläge.

Content-Key: 204123

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

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

Member: Endoro
Endoro Mar 28, 2013 at 17:27:45 (UTC)
Goto Top
Hallo B-Real, du könntest die Batch 5 Minuten in einer Schleife laufen lassen und die PIDs dann überprüfen.


bb
Member: rubberman
rubberman Mar 28, 2013 updated at 18:27:49 (UTC)
Goto Top
Hallo Zusammen.

Schleife ist gut, aber die PID benötigt man eigentlich nicht.
@echo off &setlocal

set "process=WinSCP.exe"  
set "max=300"  
set "step=30"  

for /l %%i in (1 %step% %max%) do (
  >nul timeout /t %step% /nobreak
  tasklist /fi "imagename eq %process%" /nh | findstr /ibc:"%process%" >nul || exit  
)

taskkill /im %process% /f

Ausnahmsweise habe ich mal ein EXIT im Code, da sich die FOR /L Schleife sonst nicht abbrechen lässt. Ansonsten wird eben alle 30s getestet ob der Prozess noch läuft.

Grüße
rubberman
Member: DerWoWusste
DerWoWusste Mar 28, 2013 at 18:31:35 (UTC)
Goto Top
...und noch ein Ansatz per Powershell:
Hi.

new-timespan -start (get-Process winscp).starttime |ft totalminutes
Member: B-Real
B-Real Mar 29, 2013 at 09:47:53 (UTC)
Goto Top
Danke rubberman, dein Vorschlag genügt vollkommen für meine Zwecke. Ist somit als gelöst markiert.
Member: JawCruncher
JawCruncher May 24, 2013 at 05:59:23 (UTC)
Goto Top
Ich mache so etwas sehr viel, da ich mit umfangreichen Batch-Dateien unter anderem meine SW-Verteilung mache. Also, auch wenn gelöst hier noch ein Ansatz:

Batch schreibt ganz zu Beginn eine Datei (ich nenne sie immer Flag-Datei) an eine definierte Stelle. Der Name der Datei ist der Name der Batch und die Prozess-ID. Eine zweite Batch-Datei wird zyklisch aufgerufen und prüft, ob die Flagdatei älter ist XX Minuten ist. Falls ja, wird davon ausgegangen, dass der Prozess hängt, dieser wird terminiert und eine Mail (per blat) an den Admin gesendet.

Bei mir laufen die Jobs der 2. Batchdatei sogar auf einem anderen Server. Vorteil ist, dass nicht nur die Laufzeit selber geprüft werden kann, sondern eben auch durch Tipp- oder Denkfehler verursachte Abbrüche der Batch erfasst werden.

Jens