Tuez un processus avec une «ligne de commande» spécifique à partir de la ligne de commande

24

Existe-t-il un utilitaire de ligne de commande qui tue tous les processus avec une ligne de commande spécifique?

Par exemple, tuez tous les processus nommés "java.exe" avec une ligne de commande qui contient "-jar selenium-server.jar". Ceci est possible via l'explorateur de processus.

ripper234
la source
3
Je crois que les deux réponses ci-dessous sont fausses, car vous ne demandez pas simplement comment tuer un processus .exe, vous demandez comment tuer un processus .exe qui contient une ligne de commande spécifique
admintech
2
Parlez-vous uniquement de Windows? Vos exemples et les réponses fournies donnent l'impression que vous êtes, mais vous ne l'avez pas spécifié.
Nathan Fellman
Pouvez-vous expliquer "comment cela est possible via Process Explorer?" Je viens de lancer un java - jar <app-name> et il ne montre que java.exe
Sathyajith Bhat
je parie qu'il / elle voulait dire "explorateur de processus sysinternals"
akira
Sysinternals Process Explorer, bien sûr. Vous pouvez afficher de nombreuses informations sur son exécution, y compris leur ligne de commande.
ripper234

Réponses:

34

Dans Windows XP, vous pouvez le faire facilement en utilisant WMIC, la console WMI . À partir d'une commande propt, tapez ce qui suit:

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

Modifier:

J'ai remplacé l'alias ' process ' par son chemin complet (' path win32_process ') tout comme le port d'Aviator. Cet alias peut ne pas être déclaré sur tous les systèmes d'exploitation.

Benoit
la source
1
+20 C'est ça! Bon sang :) Moi aussi, je suivais le WMIC. Mais je le faisais depuis la console WMIC et je ne pouvais pas appliquer LIKE. J'obtenais des erreurs de syntaxe, qui m'obligeaient à utiliser '=', ce qui m'obligeait à mon tour à entrer tout le champ CommandLine. Heureux de savoir que LIKE fonctionne en dehors de la console WMIC. J'aurais dû y penser. Félicitations à vous
Un nain
fonctionne parfaitement lorsque je l'appelle à partir de la ligne de commande. J'ai TeamCity démarrer un processus que je dois tuer à la fin de la construction. D'une manière ou d'une autre, lorsque la même ligne de commande appelée par TeamCity renvoie "Aucune instance disponible", la même commande comme copiée / collée sur cmd tue correctement le processus. Des idées pourquoi serait-ce?
root
3
Juste un petit conseil pour les fichiers cmd - pour utiliser cette commande à partir du fichier cmd, vous devez remplacer d'échappement tous les caractères '%' par un deuxième caractère '%', par exemple ... CommandLIne Comme '%% - jar ...
sarh
8

Si vous utilisez une version Windows qui contient une commande WMIC. Vous pouvez essayer ceci

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

Le more +1supprime la première ligne contenant l'en-tête et imprime le PID seul. S'il y a plus d'un processus java contenant selenium.jar, cela retournera un PID par ligne.

vpram86
la source
3

Je pense que vous pouvez le faire avec PowerShell en utilisant Get-Process et StartInfo.Arguments sur le processus que vous souhaitez.

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

(Je n'ai pas testé cela complètement, mais vous devriez pouvoir le modifier pour le faire fonctionner)

brien
la source
Je l'ai essayé avec le bloc-notes, mais les startinfo.arguments étaient vides.
js2010
3

Simple doublure en PowerShell:

(Get-WmiObject win32_process -filter "Name='java.exe' AND CommandLine LIKE '%-jar selenium-server.jar%'").Terminate()
wisbucky
la source
Je devrais vraiment apprendre le PS un jour.
ripper234
2

Powershell: -

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

J'utilise une variante du script PowerShell de Brain .

Cela génère également la ligne de commande et d'autres informations.

$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
la source
0

Une autre variation PowerShell. C'est fondamentalement la même chose, peut-être plus facile à taper et à mémoriser. -match peut en fait prendre une expression régulière.

get-wmiobject win32_process | where commandline -match selenium-server.jar 
  | remove-wmiobject
js2010
la source
Pourriez-vous expliquer la différence entre votre commande PS et les autres ici?
Burgi
C'est fondamentalement la même chose. Peut-être plus facile à taper et à mémoriser. -match peut en fait prendre une expression régulière.
js2010
Vous devriez modifier votre réponse pour inclure cela ...
Burgi
-2

Utilisez le PsKill gratuit :

pskill java.exe

harrymc
la source
1
vous avez manqué la 2e partie de la question: "ligne de commande spécifique" ... pas le premier java.exe, qui vient ... ni tous les processus java.exe
akira