Uccidi un processo con una specifica "Riga di comando" dalla riga di comando


24

Esiste un'utilità da riga di comando che uccide tutti i processi con una riga di comando specifica?

Ad esempio, uccidere tutti i processi denominati "java.exe" con una riga di comando che contiene "-jar selenium-server.jar". Ciò è possibile tramite Esplora processi.


3
Credo che entrambe le risposte qui sotto siano sbagliate, poiché non stai semplicemente chiedendo come uccidere un processo .exe, stai chiedendo come uccidere un processo .exe che contiene una riga di comando specifica
admintech

2
Stai parlando solo di Windows? I tuoi esempi e le risposte fornite ti fanno sembrare come te, ma non l'hai specificato.
Nathan Fellman,

Puoi spiegare "come è possibile tramite Process Explorer?" Ho appena lanciato un java - jar <app-name> e mostra solo java.exe
Sathyajith Bhat

Scommetto che intendeva "esploratore di processi sysinternals"
Akira,

Sysinternals Process Explorer, ovviamente. È possibile visualizzare molte informazioni sull'esecuzione dei processi da esso, inclusa la loro riga di comando.
ripper234,

Risposte:


34

In Windows XP, puoi farlo facilmente utilizzando WMIC, la console WMI . Da un prompt dei comandi, digitare quanto segue:

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

Modificare:

Ho sostituito l'alias ' process ' con il suo percorso completo (' path win32_process ') come è la porta di Aviator. Questo alias potrebbe non essere dichiarato su tutti i sistemi operativi.


1
+20 Questo è tutto! Accidenti :) Anche io stavo seguendo il WMIC. Ma lo stavo facendo dalla console WMIC e non ero in grado di applicare LIKE. Stavo ottenendo errori di sintassi, che mi stavano costringendo a usare '=', che a sua volta mi ha costretto a inserire l'intero campo CommandLine. Sono contento di sapere che LIKE funziona al di fuori della console WMIC. Avrei dovuto pensarci. Complimenti a te
A Dwarf

funziona perfettamente quando lo chiamo dalla riga di comando. Ho TeamCity che avvia un processo che devo terminare alla fine della build. In qualche modo quando la stessa riga di comando chiamata da TeamCity restituisce "Nessuna istanza disponibile", lo stesso comando come copiato / incollato in cmd termina correttamente il processo. Qualche idea sul perché sarebbe?
radice

3
Solo un piccolo suggerimento per i file cmd: per utilizzare questo comando dal file cmd è necessario sostituire escape tutti i caratteri '%' con un secondo carattere '%', ad es. CommandLIne Come '%% - jar ...
sarh

8

Se si utilizza una versione di Windows che contiene il comando WMIC. Puoi provare questo

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

Il more +1rimuove prima riga contenente l'intestazione e stampa il PID solo. Se sono presenti più processi java contenenti selenium.jar, verrà restituito un PID per riga.


3

Credo che potresti farlo con PowerShell usando Get-Process e StartInfo.Arguments sul processo che desideri.

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

(Non l'ho provato completamente, ma dovresti essere in grado di modificarlo per farlo funzionare)


L'ho provato con il blocco note, ma startinfo.arguments era vuoto.
js2010,

3

One-liner semplice in PowerShell:

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

Dovrei davvero imparare PS qualche volta.
ripper234

2

PowerShell: -

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

1

Uso una variante dello script PowerShell di Brain .

Ciò genera anche la riga di comando e altre informazioni.

$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

Un'altra variante di PowerShell. È praticamente lo stesso, forse più facile da scrivere e ricordare. -match può effettivamente assumere un'espressione regolare.

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

Potresti spiegare la differenza tra il tuo comando PS e gli altri qui?
Burgi,

È praticamente lo stesso. Forse più facile da scrivere e ricordare. -match può effettivamente assumere un'espressione regolare.
js2010,

Dovresti modificare la tua risposta per includere ...
Burgi,

-2

Usa il PsKill gratuito :

pskill java.exe


1
hai perso la seconda parte della domanda: "riga di comando specifica" ... non il primo java.exe, che arriva ... né tutti i processi java.exe
Akira
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.