Uccidi un processo cercando la porta utilizzata da un .BAT


128

In Windows cosa può cercare la porta 8080 e provare a interrompere il processo che sta utilizzando attraverso un file .BAT?


Posso farti parte del percorso lì ... dal prompt dei comandi utilizzare il comando 'netstat -a -n -o' e vedrai un elenco di processi e su quali porte sono in ascolto (così come ip e se sono collegati a un altro IP o no ..) Inestimabile. Ci saranno quasi sicuramente interruttori più belli per perfezionare i risultati, ma non riesco a ricordarmeli dalla mano ... Spero che qualcuno possa basarsi su questo?
Dave,

In Linux puoi. se installi cygwin potresti anche essere in bat
Dani

@Dani, Mike: Cygwin è un'enorme dipendenza e non è necessario per risolvere questo problema. Se ce l'hai già, usalo - gli strumenti da riga di comando di Linux sono molto meglio.
Merlyn Morgan-Graham,

Risposte:


141

Ecco un comando per iniziare:

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

Quando sei sicuro del tuo file batch, rimuovi @ECHO.

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

Si noti che potrebbe essere necessario modificarlo leggermente per diversi sistemi operativi. Ad esempio, su Windows 7 potrebbe essere necessario tokens=5invece di tokens=4.

Come funziona

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

Ciò consente di eseguire commande passare in rassegna il suo output. Ogni riga verrà inserita %variablee potrà essere espansa otherCommandtutte le volte che vuoi, ovunque tu voglia. %variablenell'uso effettivo può avere solo un nome di una sola lettera, ad es %V.

"tokens=4 delims= "

Questo ti consente di dividere ogni linea per spazio bianco, prendere il quarto pezzo in quella linea e inserirla %variable(nel nostro caso %%P). delimssembra vuoto, ma quello spazio extra è in realtà significativo.

netstat -a -n -o

Eseguilo e scoprilo. Secondo la guida della riga di comando, "Visualizza tutte le connessioni e le porte di ascolto", "Visualizza gli indirizzi e i numeri di porta in forma numerica" ​​e "Visualizza l'ID del processo proprietario associato a ciascuna connessione.". Ho appena usato queste opzioni da quando qualcun altro lo ha suggerito, ed è successo a funzionare :)

^|

Questo prende l'output del primo comando o programma ( netstat) e lo passa a un secondo programma di comando ( findstr). Se lo stessi utilizzando direttamente sulla riga di comando, anziché all'interno di una stringa di comando, utilizzeresti |invece di ^|.

findstr :8080

Questo filtra qualsiasi output che vi viene passato, restituendo solo le righe che contengono :8080.

TaskKill.exe /PID <value>

Questo uccide un'attività in esecuzione, utilizzando l'ID processo.

%%P instead of %P

Questo è richiesto nei file batch. Se lo facessi sul prompt dei comandi, utilizzeresti %Pinvece.


Potrebbe essere necessario giocare con gettoni, delims, ecc Vedi HELP FORsulla riga di comando per vedere un sacco di altre opzioni che FORvi darà, e verificare netstat -?, findstr /?e TaskKill /?anche per ulteriori informazioni.
Merlyn Morgan-Graham,

Lo proverò e ti risponderò.
Mike Flynn,

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

10
Questo è fantastico tokens=4è Windows XP penso e tokens=5Windows 7. Anche una buona idea per /Fforzare l'uccisione.
Strelok,

1
@ MerlynMorgan-Graham poiché questa è una risposta accettata, ti preghiamo di considerare di aggiungere punti da stackoverflow.com/a/20637662/5243762 anche questa risposta
IAmSurajBobade,

196

Apri il prompt dei comandi ed esegui i seguenti comandi

 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

, qui 3116 è l'ID del processo


sì, sarà diverso ovunque
Mohit Singh,

3
molto utile ! Intendiamoci, cerco: 3000 invece di 0.0: 3000 perché potrebbe essere inferiore a 127.0.01 anziché 0.0.0.0
Leeeeeeelo,

2
Grazie, ottimo lavoro uccidendo un'attività di sviluppo webpack fuori controllo :)
danjah

Oppure puoi semplicemente fornire netstat -ano | findstr: 9797 taskkill / PID typeyourPIDhere / F Qui 9797 è il numero di porta, utilizzo spesso questo comando per interrompere il comportamento anomalo / impiccagione del server.
Mohit Singh,

53

Per trovare un processo specifico sulla riga di comando, utilizzare qui sotto il comando 8080 è la porta utilizzata dal processo

netstat -ano | findstr 8080

per terminare il processo usa qui sotto il comando 21424 è id processo

taskkill /pid 21424 /F 

@EralpB Enjoy :)
Girdhar Singh Rathore,

19

L'uso della soluzione di Merlyn ha causato la morte di altre applicazioni come Firefox. Questi processi utilizzavano la stessa porta, ma non come listener:

per esempio:

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

Pertanto, è possibile escluderli aggiungendo "ASCOLTO" al findstr come segue:

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

18

Per elencare tutto il processo in esecuzione sulla porta 8080, procedere come segue.

netstat -ano | trova "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Quindi per terminare il processo eseguire il comando seguente

taskkill / F / PID 10612


13

Grazie a tutti, solo per aggiungere che alcuni processi non si chiuderanno a meno che anche l'opzione / F force non venga inviata con TaskKill. Inoltre con l'opzione / T, tutti i thread secondari del processo verranno chiusi.

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

Per i servizi sarà necessario ottenere il nome del servizio ed eseguire:

sc stop ServiceName


2

Solo per completamento:

Volevo uccidere tutti i processi collegati a una porta specifica ma non il processo in ascolto

il comando (nella shell cmd) per la porta 9001 è:

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

findstr :

  • r è per le espressioni ec per la catena esatta da abbinare.
  • [] * è per gli spazi corrispondenti

netstat :

  • a -> all
  • n -> non risolvere (più velocemente)
  • o -> pid

Funziona perché netstat stampa la porta di origine, quindi la porta di destinazione e quindi STABILITO


2

Creato un file bat con i seguenti contenuti, accetta l'input per il numero di porta

@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

Infine, fai clic su "Invio" per uscire.


@TusharPandey Questa è una domanda taggata su Windows, quindi è uno script di Windows, non uno script di shell
Sireesh Yarlagadda,

1

Se si desidera interrompere il processo in ascolto sulla porta 8080, è possibile utilizzare PowerShell. Basta unire il Get-NetTCPConnectioncmdlet a Stop-Process.

Testato e dovrebbe funzionare con PowerShell 5 su Windows 10 o Windows Server 2016. Tuttavia, suppongo che dovrebbe funzionare anche su versioni precedenti di Windows su cui è installato PowerShell 5.

Ecco un esempio:

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

Simile alla risposta di Merlyn, ma anche questa gestisce questi casi:

  • Il numero di porta è in realtà una sottostringa sinistra di un altro numero di porta più lungo che non stai cercando. Vuoi cercare un numero di porta esatto in modo da non uccidere un processo casuale e innocente!
  • Il codice dello script deve poter essere eseguito più di una volta ed essere corretto ogni volta, senza mostrare risposte più vecchie e errate.

Ecco qui:

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

passi:

  1. Vai alla confcartella del tuo server Apache Tomcat . Nel mio caso, è apache-tomcat-7.0.61\confcome sto usando apache-tomcat-7.0.61

  2. Apri server.xmle modifica il numero di porta da 8080 a qualsiasi altra porta come desideri. Ad esempio: 8081.8082.808 ecc

  3. Ora vai alla bincartella ed eseguishutdown.bat

  4. Ora riavvia il server tramite eclipse.

Ora il tuo progetto funzionerà senza alcuna interruzione.


0

Se qualcuno è alla ricerca di uno 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)
    }
}

Questa funzione sostanzialmente fa quello che fanno le funzioni precedenti, ma è nel formato di scripting Powershell, quindi puoi aggiungerla al tuo profilo Powershell. Per trovare la posizione del tuo profilo, vai su PowerShell e digitaecho $profile


1
Questo non è in realtà uno script di PowerShell, ma uno netstatstrumento wrapper basato su PowerShell .
bahrep,

0

Incollalo nella riga di comando

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

Se vuoi usarlo in un batch pu %%Pinvece di%P


Questo dipende dalla lingua del sistema operativo, un modo per farlo funzionare per tutte le lingue?
Jakob

@Jakob Questo può essere eseguito solo nel terminale cmd in Windows, anche solo nei file
.cmd

Sì, ma solo in lingua inglese, altrimenti "ASCOLTO" verrà tradotto nella lingua del sistema operativo.
Jakob,

@Jakob Non sono a conoscenza del fatto che lo netstatstrumento sia tradotto in altre lingue
Eduard Florinescu, il

0

se per sistema non puoi terminarlo. prova questo comando

x:> net stop http / y


3
Cosa significa "se per sistema"? E in che modo questa risposta è migliore di tutte le altre?
Nico Haase,
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.