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.


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.


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.


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)


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()

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}}

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

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

¿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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.