Zabij proces za pomocą określonej „linii poleceń” z linii poleceń

24

Czy istnieje narzędzie wiersza polecenia, które zabija wszystkie procesy za pomocą określonego wiersza polecenia?

Np. Zabij wszystkie procesy o nazwie „java.exe” za pomocą wiersza polecenia zawierającego „-jar selenium-server.jar”. Jest to możliwe poprzez eksplorator procesów.

ripper234
źródło
3
Uważam, że obie poniższe odpowiedzi są błędne, ponieważ nie pytasz tylko, jak zabić proces .exe, pytasz, jak zabić proces .exe, który zawiera określoną linię poleceń
admintech
2
Czy mówisz tylko o systemie Windows? Twoje przykłady i dostarczone odpowiedzi sprawiają wrażenie, jakbyś był, ale nie określiłeś tego.
Nathan Fellman
Czy możesz wyjaśnić „jak to jest możliwe za pomocą Process Explorer?” Właśnie uruchomiłem java-jar <nazwa aplikacji> i pokazuje tylko
java.exe
Założę się, że on / ona miała na myśli „sysinternals process explorer”
akira,
Oczywiście Sysinternals Process Explorer. Możesz wyświetlić z niego wiele informacji na temat uruchamiania procesów, w tym ich wiersza poleceń.
ripper234

Odpowiedzi:

34

W systemie Windows XP można to łatwo zrobić za pomocą WMIC, konsoli WMI . W poleceniu polecenia wpisz następujące polecenie:

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

Edytować:

Alias ​​„ proces ” zastąpiłem pełną ścieżką („ ścieżka win32_process ”), podobnie jak port programu Aviator. Ten alias może nie zostać zadeklarowany w każdym systemie operacyjnym.

Benoit
źródło
1
+20 To wszystko! Cholera :) Ja też śledziłem WMIC. Ale robiłem to z poziomu konsoli WMIC i nie mogłem zastosować LIKE. Otrzymywałem błędy składniowe, które zmuszały mnie do użycia „=”, co z kolei zmusiło mnie do wprowadzenia całego pola CommandLine. Cieszę się, że LIKE działa poza konsolą WMIC. Powinienem o tym pomyśleć. Uznanie dla ciebie
Dwarf
działa idealnie, gdy dzwonię z wiersza poleceń. TeamCity rozpoczyna proces, który muszę zabić na końcu kompilacji. W jakiś sposób, gdy ta sama linia poleceń wywoływana przez TeamCity zwraca „Brak dostępnych instancji”, to ta sama komenda jak kopiowanie / wklejanie do cmd zabija proces poprawnie. Jakieś pomysły, dlaczego to miałoby być?
root
3
Tylko mała wskazówka dotycząca plików cmd - aby użyć tego polecenia z pliku cmd, należy zastąpić znaki zmiany znaczenia wszystkimi
znakami
8

Jeśli używasz wersji systemu Windows, która zawiera polecenie WMIC. Możesz tego spróbować

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

more +1Usuwa pierwszą linię zawierającą nagłówek i drukuje PID sam. Jeśli istnieje więcej niż jeden proces Java zawierający selenium.jar, to zwróci jeden PID na linię.

vpram86
źródło
3

Wierzę, że możesz to zrobić za pomocą PowerShell za pomocą Get-Process i StartInfo.Arguments na żądanym procesie.

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

(Nie przetestowałem tego całkowicie, ale powinieneś być w stanie go ulepszyć, aby działał)

brien
źródło
Próbowałem z notatnikiem, ale pliki startinfo.arguments były puste.
js2010
3

Prosty jednowarstwowy w PowerShell:

(Get-WmiObject win32_process -filter "Name='java.exe' AND CommandLine LIKE '%-jar selenium-server.jar%'").Terminate()
wisbucky
źródło
Powinienem kiedyś naprawdę nauczyć się PS.
ripper234
2

PowerShell: -

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

Używam wariacji skryptu PowerShell Brain .

Wyświetla wiersz poleceń i inne informacje.

$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.
źródło
0

Kolejna odmiana PowerShell. Jest to w zasadzie to samo, być może łatwiejsze do pisania i zapamiętywania. -match może faktycznie przyjąć wyrażenie regularne.

get-wmiobject win32_process | where commandline -match selenium-server.jar 
  | remove-wmiobject
js2010
źródło
Czy możesz tutaj wyjaśnić różnicę między twoim poleceniem PS a innymi?
Burgi
Zasadniczo jest tak samo. Być może łatwiejsze do pisania i zapamiętywania. -match może faktycznie przyjąć wyrażenie regularne.
js2010
Powinieneś edytować swoją odpowiedź, aby uwzględnić, że ...
Burgi
-2

Skorzystaj z darmowego PsKill :

pskill java.exe

harrymc
źródło
1
przegapiłeś drugą część pytania: „konkretny wiersz polecenia” ... nie pierwszy plik java.exe, który pojawia się ... ani wszystkie procesy
java.exe