Tuez un processus en recherchant le port utilisé par celui-ci à partir d'un fichier .BAT


128

Dans Windows, que peut rechercher le port 8080 et essayer de tuer le processus qu'il utilise via un fichier .BAT?


Je peux vous faire une partie du chemin là-bas ... à partir de l'invite de commande, utilisez la commande 'netstat -a -n -o' et vous verrez une liste de processus et les ports sur lesquels ils écoutent (ainsi que ip et si ils sont connectés à une autre IP ou pas ..) Inestimable. Il y aura certainement des commutateurs plus agréables pour affiner les résultats, mais je ne me souviens pas d'eux ... Espérons que quelqu'un puisse s'appuyer sur cela?
Dave

Sous Linux, vous pouvez. si vous installez cygwin, vous pourrez également le faire
Dani

@Dani, Mike: Cygwin est une énorme dépendance et n'est pas nécessaire pour résoudre ce problème. Si vous l'avez déjà, utilisez-le - les outils de ligne de commande Linux sont bien meilleurs.
Merlyn Morgan-Graham

Réponses:


141

Voici une commande pour vous aider à démarrer:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

Lorsque vous êtes sûr de votre fichier de commandes, supprimez @ECHO.

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

Notez que vous devrez peut-être modifier légèrement cela pour différents systèmes d'exploitation. Par exemple, sur Windows 7, vous pourriez avoir besoin à la tokens=5place de tokens=4.

Comment ça marche

FOR /F ... %variable IN ('command') DO otherCommand %variable...

Cela vous permet d'exécuter commandet de boucler sa sortie. Chaque ligne sera remplie %variableet peut être étendue otherCommandautant de fois que vous le souhaitez, où vous le souhaitez. %variableen utilisation réelle ne peut avoir qu'un nom à une seule lettre, par exemple %V.

"tokens=4 delims= "

Cela vous permet de diviser chaque ligne par un espace, de prendre le 4ème morceau de cette ligne et de le remplir %variable(dans notre cas, %%P). delimssemble vide, mais cet espace supplémentaire est en fait significatif.

netstat -a -n -o

Exécutez-le et découvrez-le. Selon l'aide de la ligne de commande, il "Affiche toutes les connexions et tous les ports d'écoute.", "Affiche les adresses et les numéros de port sous forme numérique." Et "Affiche l'ID de processus propriétaire associé à chaque connexion.". Je viens d'utiliser ces options depuis que quelqu'un d'autre l'a suggéré, et cela a fonctionné :)

^|

Cela prend la sortie de la première commande ou programme ( netstat) et la transmet à un deuxième programme de commande ( findstr). Si vous l'utilisiez directement sur la ligne de commande, au lieu de l'intérieur d'une chaîne de commande, vous utiliseriez à la |place de ^|.

findstr :8080

Cela filtre toute sortie qui y est passée, ne renvoyant que les lignes contenant :8080.

TaskKill.exe /PID <value>

Cela tue une tâche en cours à l'aide de l'ID de processus.

%%P instead of %P

Ceci est requis dans les fichiers de commandes. Si vous avez fait cela sur l'invite de commande, vous utiliseriez à la %Pplace.


Vous devrez peut - être jouer avec des jetons, delims, etc. Vérifiez HELP FORsur la ligne de commande pour voir beaucoup d'autres options qui FORvous donnera, et vérifier netstat -?, findstr /?et TaskKill /?pour encore plus d' aide.
Merlyn Morgan-Graham

Je vais l'essayer et vous recontacter.
Mike Flynn

6
FOR / F "tokens = 5 delims =" %% P IN ('netstat -a -n -o ^ | findstr: 8080') DO TaskKill.exe / F / PID %% P
Mike Flynn

10
C'est bien. tokens=4est Windows XP je pense et tokens=5Windows 7. Aussi une bonne idée pour /Fforcer la mise à mort.
Strelok

1
@ MerlynMorgan-Graham car c'est une réponse acceptée, veuillez envisager d'ajouter des points à partir de stackoverflow.com/a/20637662/5243762 cette réponse également
IAmSurajBobade

196

Ouvrez l'invite de commande et exécutez les commandes suivantes

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

, ici 3116 est l'ID de processus


ouais ça va différer partout
Mohit Singh

3
très utile ! Remarquez que je recherche: 3000 au lieu de 0.0: 3000 car il pourrait être inférieur à 127.0.01 au lieu de 0.0.0.0
Leeeeeeelo

2
Merci, excellent travail pour tuer une tâche de développement
Webpack incontrôlable

Ou vous pouvez simplement fournir netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Ici 9797 est le numéro de port, j'utilise fréquemment cette commande pour tuer le serveur défectueux / bloqué.
Mohit Singh

53

Pour trouver un processus spécifique sur la ligne de commande, utilisez la commande ci-dessous ici 8080 est le port utilisé par le processus

netstat -ano | findstr 8080

pour tuer le processus, utilisez la commande ci-dessous ici 21424 est l'identifiant du processus

taskkill /pid 21424 /F 

@EralpB Enjoy :)
Girdhar Singh Rathore

19

L'utilisation de la solution de Merlyn a causé la mort d'autres applications comme Firefox. Ces processus utilisaient le même port, mais pas comme écouteur:

par exemple:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

Par conséquent, vous pouvez les exclure en ajoutant "LISTENING" au findstr comme suit:

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

Pour répertorier tous les processus exécutés sur le port 8080, procédez comme suit.

netstat -ano | trouver "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

Ensuite, pour tuer le processus, exécutez la commande suivante

taskkill / F / PID 10612


13

Merci à tous, juste pour ajouter que certains processus ne se fermeront que si le commutateur de force / F est également envoyé avec TaskKill. Également avec le commutateur / T, tous les threads secondaires du processus seront fermés.

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

Pour les services, il sera nécessaire d'obtenir le nom du service et d'exécuter:

sc stop ServiceName


2

Juste pour terminer:

Je voulais tuer tous les processus connectés à un port spécifique mais pas le processus en écoute

la commande (dans le shell cmd) pour le port 9001 est:

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr :

  • r correspond aux expressions et c correspond à la chaîne exacte.
  • [] * est pour les espaces correspondants

netstat :

  • a -> tout
  • n -> ne résout pas (plus vite)
  • o -> pid

Cela fonctionne parce que netstat imprime le port source puis le port de destination, puis ESTABLISHED


2

Créé un fichier bat avec le contenu ci-dessous, il accepte l'entrée pour le numéro de port

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

Enfin, cliquez sur "Entrée" pour quitter.


@TusharPandey Ceci est une question étiquetée Windows, donc c'est un script Windows, pas un script shell
Sireesh Yarlagadda

1

Si vous souhaitez arrêter le processus qui écoute sur le port 8080, vous pouvez utiliser PowerShell. Get-NetTCPConnectionCombinez simplement l' applet de commande avec Stop-Process.

Testé et devrait fonctionner avec PowerShell 5 sur Windows 10 ou Windows Server 2016. Cependant, je suppose qu'il devrait également fonctionner sur les anciennes versions de Windows sur lesquelles PowerShell 5 est installé.

Voici un exemple:

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

0

Similaire à la réponse de Merlyn, mais celle-ci gère également ces cas:

  • Le numéro de port est en fait une sous-chaîne gauche d'un autre numéro de port plus long que vous ne recherchez pas. Vous voulez rechercher un numéro de port exact afin de ne pas tuer un processus aléatoire et innocent!
  • Le code de script doit pouvoir s'exécuter plus d'une fois et être correct à chaque fois, sans afficher de réponses plus anciennes et incorrectes.

C'est ici:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

0

Pas:

  1. Accédez au confdossier de votre serveur apache tomcat . Dans mon cas, c'est apache-tomcat-7.0.61\confcomme j'utilise apache-tomcat-7.0.61

  2. Ouvrez server.xmlet changez le numéro de port de 8080 à n'importe quel autre port comme vous le souhaitez. Par exemple: 8081,8082,8087 etc.

  3. Maintenant, allez dans le bindossier et exécutezshutdown.bat

  4. Redémarrez maintenant le serveur via eclipse.

Maintenant, votre projet fonctionnera sans aucune interruption.


0

Si quelqu'un recherche un script Powershell:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

Cette fonction fait essentiellement ce que font les fonctions ci-dessus, mais elle est au format de script Powershell afin que vous puissiez l'ajouter à votre profil Powershell. Pour trouver l'emplacement de votre profil, accédez à PowerShell et tapezecho $profile


1
Ce n'est pas vraiment un script PowerShell, mais un wrapper autour de PowerShell netstat.
bahrep

0

Collez ceci dans la ligne de commande

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

Si vous souhaitez l'utiliser dans un batch pu %%Pau lieu de%P


Cela dépend de la langue du système d'exploitation, un moyen de le faire fonctionner pour toutes les langues?
Jakob

@Jakob Cela ne peut être exécuté que dans le terminal cmd de Windows, également uniquement dans les fichiers .cmd ou .bat
Eduard Florinescu

Oui, mais uniquement en anglais, sinon "LISTENING" sera traduit dans la langue de l'OS.
Jakob le

@Jakob Je ne suis pas au courant que l' netstatoutil est traduit dans d'autres langues
Eduard Florinescu

0

si vous par système, vous ne pouvez pas terminer la tâche. essayez cette commande

x:> arrêt net http / y


3
Que signifie «si vous par système»? Et en quoi cette réponse est-elle meilleure que toutes les autres?
Nico Haase
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.