web-dev-qa-db-fra.com

Windows: moyen le plus rapide de tuer un processus en cours d'exécution sur un port spécifique

Je vais sur ce processus plusieurs fois. Je dois tuer un processus sur une machine Windows et je connais juste son port. En règle générale, procédez comme suit: Recherchez le PID en consultant les ports (exemple, le port 8084). Répertoriez les processus en cours d'exécution sur les ports.

netstat -a -o -n

Et puis tuez le processus sur ce port avec la commande suivante

taskkill /F /PID <pid>

Y at-il quelque chose comme un tuyau ou similaire que je peux utiliser sous Windows pour exécuter cette commande en une seule ligne!?

10
Armand

Existe-t-il quelque chose comme un tuyau ou similaire que je peux utiliser sous Windows pour exécuter cette commande sur une ligne?

cmd.exe et PowerShell prennent en charge les canaux d'une commande à l'autre. Dans PowerShell, quelque chose comme (cela devrait être sur une seule ligne de la ligne de commande, ou utilisez `pour échapper à des nouvelles lignes dans un script):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

Où:

  • Select -skip 4 ignore les quatre premières lignes d'en-tête. (Selectest l'abréviation de Select-Object utilisé pour exécuter SQL SELECT comme des projets d'objets.
  • % est l'abréviation de Foreach-Object qui exécute un bloc de script sur chaque objet ($_) du pipeline et renvoie les résultats du bloc de script dans le pipeline. Ici, il commence par diviser les entrées en un tableau de champs, puis en créant un nouvel objet avec deux propriétés: Originalname__, la chaîne de netstatet Fieldsname__, le tableau qui vient d'être créé.
  • ? est l'abréviation de Where-Object qui filtre en fonction du résultat d'un bloc de script. Correspondant ici à une expression rationnelle à la fin du deuxième champ (tous les conteneurs PowerShell sont basés sur zéro).

(Tous testés sauf le dernier élément: je ne veux pas commencer à tuer les processus :-)).

En pratique, je simplifierais ceci, par exemple. ne renvoie que 0 ou le PID du premier foreach(qui serait conçu pour ignorer les en-têtes) et filtre sur la valeur non nulle avant d'appeler taskkillname__. Cela serait plus rapide à taper mais plus difficile à suivre sans connaître PowerShell.

9
Richard

Voici une fonction pratique que vous pouvez utiliser:

https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1

killp 8081
1
majkinetor

Ouvrez l'invite de commande et exécutez:

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

Si vous voulez le faire dans un fichier .bat, remplacez % a par %% a.

Si vous voulez juste tuer celui qui écoute sur ce port, ajoutez (^ | find "LISTENING") à la fin de l'autre find.

0
Josep Alsina