Mata un proceso con una "Línea de comando" específica desde la línea de comando

24

¿Existe una utilidad de línea de comando que mate todos los procesos con una línea de comando específica?

Por ejemplo, elimine todos los procesos llamados "java.exe" con una línea de comando que contenga "-jar selenium-server.jar". Esto es posible a través del explorador de procesos.

ripper234
fuente
3
Creo que tanto las respuestas a continuación están equivocados, ya que te enviaban simplemente preguntando cómo matar a un proceso .exe, que está pidiendo cómo matar a un proceso .exe que contiene una línea de comando específico
admintech
2
¿Solo estás hablando de Windows? Sus ejemplos y las respuestas proporcionadas hacen que parezca que es usted, pero no especificó esto.
Nathan Fellman el
¿Puede explicar "cómo esto es posible a través de Process Explorer?" Acabo de lanzar un java - jar <app-name> y muestra solo java.exe
Sathyajith Bhat
apuesto a que él / ella quiere decir "sysinternals Process Explorer"
Akira
Sysinternals Process Explorer, por supuesto. Puede ver mucha información sobre los procesos en ejecución, incluida su línea de comando.
ripper234

Respuestas:

34

En Windows XP, puede hacer esto fácilmente utilizando WMIC, la consola WMI . Desde un comando propt, escriba lo siguiente:

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

Editar:

Reemplacé el alias ' proceso ' por su ruta completa (' ruta win32_process ') como es el puerto de Aviator. Es posible que este alias no se declare en todos los sistemas operativos.

Benoit
fuente
1
+20 ¡Eso es! Maldita sea :) Yo también estaba siguiendo la WMIC. Pero lo estaba haciendo desde la consola WMIC y no podía aplicar LIKE. Recibía errores de sintaxis, lo que me obligaba a usar '=', lo que a su vez me obligaba a ingresar todo el campo CommandLine. Me alegra saber que LIKE funciona fuera de la consola WMIC. Debería haber pensado en eso. Felicitaciones a ustedes
Un enano
funciona perfectamente cuando lo llamo desde la línea de comandos. Tengo TeamCity iniciando un proceso que necesito matar al final de la compilación. De alguna manera, cuando la misma línea de comando llamada por TeamCity devuelve "No hay instancias disponibles", el mismo comando como copiado / pegado a cmd mata el proceso correctamente. ¿Alguna idea de por qué sería eso?
root
3
Solo un pequeño consejo para los archivos cmd: para usar este comando desde el archivo cmd, debe reemplazar todos los caracteres '%' con un segundo carácter '%', por ejemplo ... CommandLIne Like '%% - jar ...
sarh
8

Si está utilizando una versión de Windows que tiene un comando WMIC. Puedes probar esto

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

La more +1quita primera línea que contiene la cabecera e imprime el PID solo. Si hay más de un proceso java que contiene selenium.jar, esto devolverá un PID por línea.

vpram86
fuente
3

Creo que podría hacer esto con PowerShell utilizando Get-Process y StartInfo. Argumentos sobre el proceso que desee.

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

(No lo he probado por completo, pero deberías poder ajustarlo para que funcione)

brien
fuente
Lo intenté con el bloc de notas, pero los argumentos de startinfo estaban en blanco.
js2010
3

One-liner simple en powershell:

(Get-WmiObject win32_process -filter "Name='java.exe' AND CommandLine LIKE '%-jar selenium-server.jar%'").Terminate()
Wisbucky
fuente
Realmente debería aprender PS alguna vez.
ripper234
2

Potencia Shell:-

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

Yo uso una variación del script PowerShell de Brain .

Esto genera la línea de comando y otra información también.

$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
fuente
0

Otra variación de PowerShell. Es básicamente lo mismo, quizás más fácil de escribir y recordar. -match en realidad puede tomar una expresión regular.

get-wmiobject win32_process | where commandline -match selenium-server.jar 
  | remove-wmiobject
js2010
fuente
¿Podría explicar la diferencia entre su comando PS y los demás aquí?
Burgi
Es básicamente lo mismo. Quizás más fácil de escribir y recordar. -match en realidad puede tomar una expresión regular.
js2010
Debería editar su respuesta para incluir eso ...
Burgi
-2

Usa el PsKill gratis :

pskill java.exe

harrymc
fuente
1
se ha perdido la segunda parte de la pregunta: "comandos específicos" ... no es la primera java.exe, que viene junto .. ni todos los procesos java.exe
Akira