Mate um processo com uma "Linha de Comando" específica da linha de comando


24

Existe um utilitário de linha de comando que mata todos os processos com uma linha de comando específica?

Por exemplo, mate todos os processos chamados "java.exe" com uma linha de comando que contém "-jar selenium-server.jar". Isso é possível através do Process Explorer.


3
Acredito que tanto as respostas abaixo estão errados, como você Arent apenas perguntando como matar um processo .exe, você está perguntando como matar um processo .exe que contém uma linha de comando específica
admintech

2
Você está falando apenas do Windows? Seus exemplos e as respostas fornecidas fazem parecer que você é, mas você não especificou isso.
21719 Nathan Fellman

Você pode explicar "como isso é possível através do Process Explorer?" Acabei de lançar um java - jar <app-name> e ele mostra apenas java.exe
Sathyajith Bhat

Aposto que ele / ela queria dizer "Sysinternals Process Explorer"
akira

Sysinternals Process Explorer, é claro. Você pode visualizar muitas informações sobre os processos em execução, incluindo a linha de comando.
Ripper234 7/10/09

Respostas:


34

No Windows XP, você pode fazer isso facilmente usando o WMIC, o console WMI . Em um comando propt, digite o seguinte:

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

Editar:

Substituí o alias ' process ' pelo caminho completo (' path win32_process ') como é a porta do Aviator. Esse alias pode não ser declarado em todos os sistemas operacionais.


1
+20 É isso aí! Droga :) Eu também estava seguindo o WMIC. Mas eu estava fazendo isso no console WMIC e não estava conseguindo aplicar o LIKE. Estava recebendo erros de sintaxe, que estavam me forçando a usar '=', o que me obrigou a inserir todo o campo CommandLine. Fico feliz em saber que o LIKE funciona fora do console WMIC. Deveria ter pensado nisso. Parabéns a você
A Dwarf #

funciona perfeitamente quando eu chamo de linha de comando. Eu tenho o TeamCity iniciando um processo que preciso eliminar no final da compilação. De alguma forma, quando a mesma linha de comando chamada pelo TeamCity retorna "Nenhuma Instância (s) Disponível", a mesma vírgula como copiada / colada no cmd mata o processo corretamente. Alguma idéia de por que isso seria?
root

3
Apenas uma pequena dica para arquivos cmd - para usar este comando do arquivo cmd, você deve substituir escape todos os '%' chars por um segundo '%' char, por exemplo ... CommandLIne Like '%% - jar ...
sarh

8

Se você estiver usando uma versão do Windows com o comando WMIC. Você pode tentar isso

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

o more +1 remove a primeira linha que contém o cabeçalho e imprime o PID sozinho. Se houver mais de um processo java contendo selenium.jar, isso retornará um PID por linha.


3

Acredito que você poderia fazer isso com o PowerShell usando Get-Process e o StartInfo.Arguments no processo que você deseja.

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

(Eu não testei isso completamente, mas você poderá ajustá-lo para que funcione)


Eu tentei com o bloco de notas, mas os argumentos startinfo.ar estavam em branco.
js2010 31/01

3

Uma linha simples no PowerShell:

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

Eu realmente deveria aprender PS algum dia.
precisa saber é o seguinte

2

Powershell: -

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

1

Eu uso uma variação do script PowerShell do Brain .

Isso gera linha de comando e outras informações também.

$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

Outra variação do PowerShell. É basicamente o mesmo, talvez mais fácil digitar e lembrar. -match pode realmente ter uma expressão regular.

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

Você poderia explicar a diferença entre o seu comando PS e os outros aqui?
Burgi 01/02

É basicamente o mesmo. Talvez seja mais fácil digitar e lembrar. -match pode realmente ter uma expressão regular.
js2010

Você deve editar sua resposta para incluir isso ...
Burgi

-2

Use o PsKill gratuito :

pskill java.exe


1
você perdeu a segunda parte da pergunta: "linha de comando específico" ... não é a primeira java.exe, que vem junto .. nem todos os processos java.exe
akira
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.