64903
Goto Top

PID herausfinden um Prozess zu beenden

Hey Leute,

ich habe folgendes Problem:
Auf einen Windows 2000 Server wird eine cm.exe aus ca. 10 verschiedenen Verzeichnissen gestartet.
Wir haben eine kleine Watchdog-Applikation laufen, die unter anderen diese 10 Prozesse überwacht.
Der Watchdog ist auch in der Lage den Prozess neu zu starten

"%CAPPATH%\bin\cm.exe server stop"
"%CAPPATH%\bin\cm.exe server start"

Leider kommt es vor, dass dieser Neustart nicht gelingt bzw. der Prozess nicht mehr stoppt.
Deshalb möchten ich einen "Kill-Befehl" hinterherschicken.

Bisher habe ich leider noch keine Möglichkeit gefunden, ausser über die PID.

1) Wie finde ich die PID zu "%CAPPATH%\bin\cm.exe" heraus?
oder
2) Wie kann ich den Prozess "%CAPPATH%\bin\cm.exe" killen?

Danke für jegliche Hilfe.
Gruss
Oliver

Content-Key: 87023

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

Ausgedruckt am: 29.03.2024 um 10:03 Uhr

Mitglied: bastla
bastla 06.05.2008 um 10:59:24 Uhr
Goto Top
Hallo Olli1234 und willkommen im Forum!

Mit dem folgende VBScript kannst Du einen Prozess auf Basis seines Pfades "killen":
'TerminateProcessByPath.vbs  

If WScript.Arguments.Count < 1 Then
    WScript.Echo "Pfad des zu beendenden Prozesses als Parameter übergeben!"  
    WScript.Quit
End If

strProc = LCase(WScript.Arguments(0))
strComputer = "."  

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process",,48)  

For Each objItem in colItems
    If Not IsNull(objItem.ExecutablePath) Then
        If LCase(objItem.ExecutablePath) = strProc Then
            WScript.Echo "Beende: " & objItem.ProcessId & " " & objItem.Name & " (" & objItem.ExecutablePath & ")"  
            objItem.Terminate
        End If
    End If
Next
Beim Aufruf ist der gewünschte Pfad zu übergeben - wenn das Script zB unter "C:\Scripts\TerminateProcessByPath.vbs" gespeichert wurde, dann:
cscript //nologo C:\Scripts\TerminateProcessByPath.vbs "%CAPPATH%\bin\cm.exe" 

Grüße
bastla
Mitglied: 59769
59769 06.05.2008 um 11:00:08 Uhr
Goto Top
Ich glaub Du kannst den Prozess mit Taskkill über den Schalter /im direkt killen.
Schau doch mal hier nach: http://technet2.microsoft.com/windowsserver/en/library/c1db6dae-41c3-4c ...
Mitglied: bastla
bastla 06.05.2008 um 11:15:43 Uhr
Goto Top
@59769

Einmal unabhängig davon, dass Du mit dem Schalter "/im" keinen Pfad angeben kannst: "taskkill" gibt's erst ab XP / Server 2003 ...

Grüße
bastla
Mitglied: 64903
64903 06.05.2008 um 17:17:31 Uhr
Goto Top
Hi bastla und danke für die schnelle Antwort!!

Leider hat sich nun herausgestellt, dass der Pfad alleine nicht reicht.
Denn es gibt mindestens eine cm.exe, die mehrmals gestartet wird..

Folgender Code spuckt die PID vom richtigen Prozess aus:
1) tasklist /fi "SERVICES eq blahblahblah" /fo list | find "PID:" | d:\temp\unix\cut.exe -C:15

Ergebnis:
2345Leerzeichen
Leerzeile

Mit taskkill könnte ich den Prozess jetzt ja killen, aber wie nur?
2) taskkill /f /fi "PID eq ???"

Wie kann ich die das Ergebnis von 1) an der Stelle '???' aus 2) verwenden?

Gruss Oliver
Mitglied: bastla
bastla 06.05.2008 um 17:42:40 Uhr
Goto Top
Hallo Olli1234!

Etwa so:
@echo off & setlocal
set PID=
for /f %%i in ('tasklist /fi "SERVICES eq blahblahblah" /fo list ^| find "PID:" ^| d:\temp\unix\cut.exe -C:15') do if not defined PID set PID=%%i  
echo Beende Prozess: %PID%
taskkill /f /PID %PID%

[Edit] Sollten mehrere Prozesse gefunden werden, wird bei obiger Version nur der erste gestoppt - falls das ev nicht so gemeint war, folgende Alternative (in der Sparvariante face-wink mit nur einer Zeile und ohne "cut.exe", aber immer noch zur Verwendung in einem Batch, daher %%i):
for /f "tokens=2 delims=," %%i in ('tasklist /fi "SERVICES eq blahblahblah" /fo csv^|more +2') do if "%%~i" neq "" echo Beende Prozess: %%~i & taskkill /f /PID %%~i  
[/Edit]

Grüße
bastla

P.S.: Wie bringst Du "tasklist" und "taskkill" auf dem 2000er-Server zum Laufen?
Mitglied: 64903
64903 07.05.2008 um 10:36:25 Uhr
Goto Top
Hi bastla!

Es wird bisher immer nur ein Prozess gefunden!
Dein Code funktioniert also auch ohne "tokens=2 delims" super!! Danke dafür!!

Der nächste konsequente Schritt ist nun, den Namen des Services als Parameter zu übergeben.
Leider funktionert folgender Aufruf nicht:
processkill "blah - blah - blah"

Quelltext:
set servicename=%1

Ergebnis:
set servicename="blah - blah - blah"

for /F %i in ('tasklist /fi "SERVICES eq "blah - blah - blah"" /fo list | find "PID:" | d:\unix\cut.exe -C:15') do if not defined PID set PID=%i

Die Anführungszeichen vor unter hinter dem Parameter sollten eigentlich nicht mehr enthalten sein :-l
Aber ohne die Anführungszeichen (beim Aufruf) geht es natürlich auch nicht.

P.S.: Wie bringst Du "tasklist" und "taskkill" auf dem 2000er-Server zum Laufen?

Ich hatte erst auf deinem Windows 2000er-Server getestet. Da ich dann nicht weiter kam, habe ich auf dem Windows 2003er-Server weitergemacht, damit ich tasklist und taskkill benutzen kann.

Gruss
Oliver
Mitglied: 59769
59769 07.05.2008 um 10:45:33 Uhr
Goto Top
@bastla
das mit Server2000 habe ich übersehen..dafür wäre wohl pskill geeignet.
Mitglied: bastla
bastla 07.05.2008 um 10:51:16 Uhr
Goto Top
Hallo Olli1234!

Dein Code funktioniert also auch ohne "tokens=2 delims"
Diese Schreibweise hat nichts damit zu tun, wieviele Prozesse gefunden werden, sondern zerlegt nur die "tasklist"-Ausgabe sauberer als mit der "cut.exe" ...

Die Anführungszeichen vor unter hinter dem Parameter sollten eigentlich nicht mehr enthalten sein.
Die Schreibweise dafür ist:
set "servicename=%~1"  
Die "for"-Zeile sähe dann so aus:
for /F %i in ('tasklist /fi "SERVICES eq "%servicename%"" /fo list | find "PID:" | d:\unix\cut.exe -C:15') do if not defined PID set PID=%i  

Grüße
bastla
Mitglied: 64903
64903 07.05.2008 um 11:11:15 Uhr
Goto Top
Hallo bastla!
Danke für deine Mühe.... die Batch funktioniert jetzt so, wie sie soll face-smile

@echo off & setlocal
set "servicename=%~1"  
set PID=
for /f %%i in ('tasklist /fi "SERVICES eq %servicename%" /fo list ^| find "PID:" ^| d:\temp\unix\cut.exe -C:15') do if not defined PID set PID=%%i  
taskkill /f /PID %PID%

Ich habe es jetzt so mit dem cut.exe gelassen!
Thread kann damit geschlossen werden.
Mitglied: bastla
bastla 07.05.2008 um 11:52:08 Uhr
Goto Top
Hallo Olli1234!

Freut mich, dass es klappt.

Thread kann damit geschlossen werden.
Das könntest Du auch Wie kann ich einen Beitrag als gelöst markieren? dokumentieren.

Vielleicht magst Du auch noch abschließend Deinen endgültigen Batch zwischen -Tags setzen ...

Grüße
bastla
Mitglied: Biber
Biber 07.05.2008 um 13:03:24 Uhr
Goto Top
Moin Olli1234,

Thread kann damit geschlossen werden.

Nein, das sehe ich anders....
Für alle MitleserInnern ist unklar, wieso Du denn auf dem W2000er Server nun doch die "TaskList" und "TaskKill"-Utililies am Laufen hast.

Das wurde mehrfach hier im Beitrag angefragt - nur Du kannst die Antwort geben.

Grüße
Biber
Mitglied: 64903
64903 07.05.2008 um 13:54:19 Uhr
Goto Top
Nein, das sehe ich anders....
Für alle MitleserInnern ist unklar, wieso Du denn auf dem W2000er Server nun doch
die "TaskList" und "TaskKill"-Utililies am Laufen hast.
Das wurde mehrfach hier im Beitrag angefragt - nur Du kannst die Antwort geben.

^^ Das hatte ich eigentlich schon beantwortet! Als ich angefangen hatte auf dem Testsystem unter Windows 2000er Server, kam ich nicht mehr weiter. Dann habe ich auf dem Livesystem mit Windows 2003er Server weitergetestet, da ich auf dem auch Tasklist und Taskkill benutzen konnte.

Ich hatte erst auf deinem Windows 2000er-Server getestet. Da ich dann nicht weiter kam,
habe ich auf dem Windows 2003er-Server weitergemacht, damit ich tasklist und taskkill
benutzen kann.

Mit anderen Worten: "Auf dem W2000er Server konnte ich selbstverständlich NICHT die "TaskList-" und "TaskKill"-Utilities benutzen"

Gruss
Oliver
Mitglied: Biber
Biber 07.05.2008 um 15:10:02 Uhr
Goto Top
Moin Oliver,

sorry, Du hast recht - ich hatte es überlesen.
Dann schließe ich jetzt den Beitrag wie gewünscht.

Danke für die Rückmeldung.

Grüße
Biber