Убить процесс с помощью определенной «командной строки» из командной строки


24

Есть ли утилита командной строки, которая убивает все процессы с определенной командной строкой?

Например, убить все процессы с именем «java.exe» с помощью командной строки, содержащей «-jar selenium-server.jar». Это возможно через проводник процессов.


3
Я полагаю, что оба приведенных ниже ответа неверны, поскольку вы не просто спрашиваете, как убить процесс .exe, вы спрашиваете, как убить процесс .exe, который содержит определенную командную строку
admintech

2
Вы говорите только о Windows? Ваши примеры и предоставленные ответы создают впечатление, что вы есть, но вы не указали это.
Натан Феллман

Можете ли вы объяснить, "как это возможно через Process Explorer?" Я только что запустил java - jar <app-name>, и он показывает только java.exe
Сатьяджит Бхат

Бьюсь об заклад, он / она имел в виду "sysinternals process explorer"
Акира

Sysinternals Process Explorer, конечно. Из него можно просмотреть много информации о запущенных процессах, включая их командную строку.
ripper234

Ответы:


34

В Windows XP это можно легко сделать с помощью WMIC, консоли WMI . В командной строке введите следующее:

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

Редактировать:

Я заменил псевдоним ' process ' на полный путь (' путь win32_process '), как и порт Aviator. Этот псевдоним не может быть объявлен на каждой ОС.


1
+20 Вот и все! Черт побери :) Я тоже следил за WMIC. Но я делал это из консоли WMIC и не мог применить LIKE. Получал синтаксические ошибки, которые заставляли меня использовать '=', что, в свою очередь, заставляло меня вводить все поле CommandLine. Рад, что LIKE работает за пределами консоли WMIC. Надо было подумать об этом. Слава тебе
Гном

отлично работает, когда я звоню из командной строки. У меня есть TeamCity, запускающий процесс, который мне нужно убить в конце сборки. Каким-то образом, когда та же командная строка, вызываемая TeamCity, возвращает «Нет доступных экземпляров», такая же запятая, как и в случае копирования / вставки в cmd, корректно завершает процесс. Есть идеи, почему это будет?
root

3
Небольшой совет для cmd-файлов - чтобы использовать эту команду из cmd-файла, вы должны заменить escape-символы "%" на второй символ "%", например ... CommandLIne Like "%% - jar ...
sarh

8

Если вы используете версию Windows, в которой есть команда WMIC. Вы можете попробовать это

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

more +1Удаляет первую строку , содержащую заголовок и печатает PID в одиночку. Если существует более одного Java-процесса, содержащего selenium.jar, это вернет один PID на строку.


3

Я полагаю, что вы можете сделать это с PowerShell, используя Get-Process и StartInfo.Arguments для нужного вам процесса.

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

(Я не проверял это полностью, но вы должны иметь возможность настроить его, чтобы он работал)


Я попробовал это с помощью блокнота, но startinfo.arguments были пустыми.
js2010

3

Простой однострочник в powershell:

(Get-WmiObject win32_process -filter "Name='java.exe' AND CommandLine LIKE '%-jar selenium-server.jar%'").Terminate()

Я должен действительно выучить PS когда-нибудь.
ripper234


1

Я использую вариацию скрипта Brain PowerShell .

Это выводит командную строку и другую информацию.

$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))..."
    }
}

0

Еще одна вариация PowerShell. Это в основном то же самое, возможно, легче напечатать и запомнить. -match может на самом деле принимать регулярное выражение.

get-wmiobject win32_process | where commandline -match selenium-server.jar 
  | remove-wmiobject

Не могли бы вы объяснить разницу между вашей командой PS и другими здесь?
Бурги

Это в основном то же самое. Возможно, легче набрать и запомнить. -match может на самом деле принимать регулярное выражение.
js2010

Вы должны отредактировать свой ответ, чтобы включить это ...
Burgi

-2

Используйте бесплатный PsKill :

pskill java.exe


1
Вы пропустили 2-ю часть вопроса: «конкретная командная строка» ... не первый java.exe, который приходит вместе ... ни все процессы java.exe
akira
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.