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.

ripper234
fonte
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.

Benoit
fonte
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.

vpram86
fonte
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)

brien
fonte
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()
wisbucky
fonte
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}}
Richard Forrester
fonte
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))..."
    }
}
Jan H
fonte
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
js2010
fonte
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

harrymc
fonte
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