In Windows cosa può cercare la porta 8080 e provare a interrompere il processo che sta utilizzando attraverso un file .BAT?
In Windows cosa può cercare la porta 8080 e provare a interrompere il processo che sta utilizzando attraverso un file .BAT?
Risposte:
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=5
invece di tokens=4
.
Come funziona
FOR /F ... %variable IN ('command') DO otherCommand %variable...
Ciò consente di eseguire command
e passare in rassegna il suo output. Ogni riga verrà inserita %variable
e potrà essere espansa otherCommand
tutte le volte che vuoi, ovunque tu voglia. %variable
nell'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
). delims
sembra 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 %P
invece.
HELP FOR
sulla riga di comando per vedere un sacco di altre opzioni che FOR
vi darà, e verificare netstat -?
, findstr /?
e TaskKill /?
anche per ulteriori informazioni.
tokens=4
è Windows XP penso e tokens=5
Windows 7. Anche una buona idea per /F
forzare l'uccisione.
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
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
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
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
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
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 :
netstat :
Funziona perché netstat stampa la porta di origine, quindi la porta di destinazione e quindi STABILITO
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.
Se si desidera interrompere il processo in ascolto sulla porta 8080, è possibile utilizzare PowerShell. Basta unire il Get-NetTCPConnection
cmdlet 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"):
Simile alla risposta di Merlyn, ma anche questa gestisce questi casi:
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.
)
passi:
Vai alla conf
cartella del tuo server Apache Tomcat . Nel mio caso, è apache-tomcat-7.0.61\conf
come sto usando apache-tomcat-7.0.61
Apri server.xml
e modifica il numero di porta da 8080 a qualsiasi altra porta come desideri. Ad esempio: 8081.8082.808 ecc
Ora vai alla bin
cartella ed eseguishutdown.bat
Ora riavvia il server tramite eclipse.
Ora il tuo progetto funzionerà senza alcuna interruzione.
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
netstat
strumento wrapper basato su PowerShell .
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 %%P
invece di%P
netstat
strumento sia tradotto in altre lingue
se per sistema non puoi terminarlo. prova questo comando
x:> net stop http / y