Beenden Sie einen Prozess mit einer bestimmten Befehlszeile über die Befehlszeile

24

Gibt es ein Befehlszeilenprogramm, das alle Prozesse mit einer bestimmten Befehlszeile beendet?

Beenden Sie beispielsweise alle Prozesse mit dem Namen "java.exe" mit einer Befehlszeile, die "-jar selenium-server.jar" enthält. Dies ist über den Process Explorer möglich.

ripper234
quelle
3
Ich glaube, beide der folgenden Antworten sind falsch, da Sie nicht nur fragen, wie ein .exe-Prozess beendet werden soll, sondern auch, wie ein .exe-Prozess beendet werden soll, der eine bestimmte Befehlszeile enthält
admintech 07.10.09
2
Sprechen Sie nur über Windows? Ihre Beispiele und die angegebenen Antworten lassen es so erscheinen, als wären Sie es, aber Sie haben dies nicht angegeben.
Nathan Fellman
Können Sie erklären, wie dies mit Process Explorer möglich ist? Ich habe gerade ein Java - jar <app-name> gestartet und es zeigt nur java.exe
Sathyajith Bhat
Ich wette, er / sie meinte "Sysinternals Process Explorer"
Akira
Natürlich Sysinternals Process Explorer. Sie können viele Informationen zum Ausführen von Prozessen anzeigen, einschließlich der Befehlszeile.
Ripper234

Antworten:

34

In Windows XP können Sie dies auf einfache Weise über WMIC, die WMI- Konsole, tun . Geben Sie in einer Befehlsanforderung Folgendes ein:

wmic Path win32_process Where "CommandLine Like '%-jar selenium-server.jar%'" Call Terminate

Bearbeiten:

Ich habe den Alias ​​' process ' durch den vollständigen Pfad (' path win32_process ') ersetzt, ebenso wie den Port von Aviator. Dieser Alias ​​kann möglicherweise nicht auf jedem Betriebssystem deklariert werden.

Benoit
quelle
1
+20 Das war's! Verdammt :) Ich habe auch die WMIC verfolgt. Aber ich habe es in der WMIC-Konsole gemacht und konnte LIKE nicht anwenden. Es traten Syntaxfehler auf, die mich zwangen, '=' zu verwenden, was mich zwang, das gesamte CommandLine-Feld einzugeben. Gut zu wissen, dass LIKE außerhalb der WMIC-Konsole funktioniert. Sollte daran gedacht haben.
Ein
funktioniert einwandfrei, wenn ich es von der Kommandozeile aus aufrufe. TeamCity startet einen Prozess, den ich am Ende des Builds beenden muss. Wenn dieselbe Befehlszeile, die von TeamCity aufgerufen wird, "No Instance (s) Available" (Keine verfügbaren Instanzen) zurückgibt, wird der Vorgang durch dasselbe Komma wie in cmd kopiert / eingefügt ordnungsgemäß abgebrochen. Irgendwelche Ideen, warum das sein sollte?
Root
3
Nur ein kleiner Tipp für cmd-Dateien - um diesen Befehl aus der cmd-Datei zu verwenden, sollten Sie alle '%' Zeichen durch ein zweites '%' Zeichen ersetzen, zB ... CommandLIne Like '%% - jar ...
sarh
8

Wenn Sie eine Windows-Version verwenden, in der der WMIC-Befehl enthalten ist. Sie können dies versuchen

wmic path win32_process Where "Caption Like '%java.exe%' AND CommandLine Like '%selenium.jar%'" get ProcessId|more +1

Das more +1entfernt die erste Zeile, die den Header enthält, und gibt nur die PID aus. Wenn es mehr als einen Java-Prozess gibt, der selenium.jar enthält, wird eine PID pro Zeile zurückgegeben.

vpram86
quelle
3

Ich glaube, Sie könnten dies mit PowerShell tun, indem Sie Get-Process und die StartInfo.Arguments für den gewünschten Prozess verwenden.

$procs = Get-Process java
foreach($proc in $procs) 
{
    if($proc.StartInfo.Arguments -contains "-jar selenium-server.jar")
    {
        kill $proc
    }
}

(Ich habe das noch nicht vollständig getestet, aber Sie sollten in der Lage sein, es zu optimieren, damit es funktioniert.)

brien
quelle
Ich habe es mit dem Editor versucht, aber die startinfo.arguments waren leer.
js2010,
3

Einfacher Einzeiler in Powershell:

(Get-WmiObject win32_process -filter "Name='java.exe' AND CommandLine LIKE '%-jar selenium-server.jar%'").Terminate()
weises Glück
quelle
Ich sollte mal wirklich PS lernen.
Ripper234
2

Power Shell:-

$oProcs = get-process explorer;foreach ($oProc in $oProcs){if ($oProc.Path.Contains('C:\Windows')) {Stop-Process $oProc.Id}}
Richard Forrester
quelle
1

Ich verwende eine Variante von Brains PowerShell-Skript .

Hiermit werden auch die Befehlszeile und andere Informationen ausgegeben.

$processes = Get-WmiObject Win32_Process -Filter "name = 'java.exe'"
foreach($proc in $processes)
{
    if($proc.CommandLine.Contains("selenium-server.jar"))
    {
        Write-Host "stopping proccess $($proc.ProcessId) with $($proc.ThreadCount) threads; $($proc.CommandLine.Substring(0, 50))..."
        Stop-Process -F $proc.ProcessId
    } else
    {
        Write-Host "skipping proccess $($proc.ProcessId) with $($proc.ThreadCount) threads; $($proc.CommandLine.Substring(0, 50))..."
    }
}
Jan H
quelle
0

Eine weitere PowerShell-Variante. Es ist im Grunde das Gleiche, vielleicht einfacher zu tippen und sich zu erinnern. -match kann tatsächlich einen regulären Ausdruck annehmen.

get-wmiobject win32_process | where commandline -match selenium-server.jar 
  | remove-wmiobject
js2010
quelle
Können Sie hier den Unterschied zwischen Ihrem PS-Befehl und den anderen erklären?
Burgi
Es ist im Grunde das gleiche. Vielleicht einfacher zu tippen und sich zu erinnern. -match kann tatsächlich einen regulären Ausdruck annehmen.
js2010
Sie sollten bearbeiten Sie Ihre Antwort , dass schließen ...
Burgi
-2

Benutze den kostenlosen PsKill :

pskill java.exe

Harrymc
quelle
1
Sie haben den 2. Teil der Frage verpasst: "Bestimmte Befehlszeile" ... nicht die erste java.exe, die mitkommt. Weder alle java.exe-Prozesse
Akira