it-swarm.com.de

Beenden Sie einen Prozess, indem Sie den von einem BAT aus verwendeten Port nachschlagen

Was kann unter Windows nach Port 8080 gesucht werden und der Prozess, den es verwendet, durch eine .BAT-Datei abgebrochen werden?

117
Mike Flynn

Hier ist ein Befehl zum Einstieg:

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

Wenn Sie mit Ihrer Batchdatei vertraut sind, entfernen Sie @ECHO.

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

Beachten Sie, dass Sie dies möglicherweise für andere Betriebssysteme geringfügig ändern müssen. Unter Windows 7 benötigen Sie beispielsweise tokens=5 anstelle von tokens=4.

Wie das funktioniert

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

Dadurch können Sie command ausführen und die Ausgabe überlaufen. Jede Zeile wird in %variable gestopft und kann in otherCommand beliebig oft erweitert werden, wo immer Sie möchten. %variable kann in der tatsächlichen Verwendung nur einen einzigen Buchstaben haben, z. %V.

"tokens=4 delims= "

Auf diese Weise können Sie jede Zeile nach Whitespace aufteilen und den vierten Block in dieser Zeile nehmen und in %variable (in unserem Fall %%P) stopfen. delims sieht leer aus, aber dieser zusätzliche Platz ist tatsächlich von Bedeutung.

netstat -a -n -o

Lass es einfach laufen und finde es heraus. Gemäß der Befehlszeilenhilfe "Zeigt alle Verbindungen und empfangenden Ports an.", "Zeigt Adressen und Portnummern in numerischer Form an." Und "Zeigt die mit jeder Verbindung verbundene Prozesskennung an." Ich habe diese Optionen gerade ausgenutzt, da jemand anderes vorgeschlagen hatte, und es funktionierte zufällig :)

^|

Dadurch wird die Ausgabe des ersten Befehls oder Programms (netstat) an ein zweites Befehlsprogramm (findstr) übergeben. Wenn Sie dies direkt in der Befehlszeile verwenden, anstatt in einer Befehlszeichenfolge, würden Sie | anstelle von ^| verwenden.

findstr :8080

Dadurch werden alle übergebenen Ausgaben gefiltert und es werden nur Zeilen zurückgegeben, die :8080 enthalten.

TaskKill.exe /PID <value>

Dies beendet eine laufende Task mit der Prozess-ID.

%%P instead of %P

Dies ist in Batchdateien erforderlich. Wenn Sie dies bei der Eingabeaufforderung tun, würden Sie stattdessen %P verwenden.

131

Öffnen Sie die Eingabeaufforderung und führen Sie die folgenden Befehle aus

 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

, hier ist 3116 die Prozess-ID

190
Mohit Singh

Um einen bestimmten Prozess in der Befehlszeile zu finden, verwenden Sie den folgenden Befehl. 8080 ist der vom Prozess verwendete Port

netstat -ano | findstr 8080

verwenden Sie den folgenden Befehl, um den Prozess zu beenden. 21424 ist die Prozess-ID

taskkill /pid 21424 /F 
51

Die Verwendung der Merlyn-Lösung hat dazu geführt, dass andere Anwendungen wie Firefox beendet wurden .. _ Diese Prozesse verwendeten den gleichen Port, jedoch nicht als Listener:

z.B:

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

Daher können Sie diese ausschließen, indem Sie der findstr "LISTENING" wie folgt hinzufügen:

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

Führen Sie die folgenden Schritte aus, um den gesamten Prozess auf Port 8080 aufzulisten.

netstat -ano | finde "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Um den Prozess zu beenden, führen Sie den folgenden Befehl aus

taskkill/F/PID 10612

16
Sardesh Sharma

Vielen Dank, nur um hinzuzufügen, dass einige Prozesse nicht geschlossen werden, es sei denn, der Force-Schalter/F wird ebenfalls mit TaskKill ..__ gesendet. Auch mit/T-Schalter werden alle sekundären Threads des Prozesses geschlossen.

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

Für Dienste ist es erforderlich, den Namen des Dienstes zu ermitteln und auszuführen:

sc stop ServiceName

13
xtrm
3
CharlesB

Nur zur Fertigstellung:

Ich wollte alle Prozesse beenden, die mit einem bestimmten Port verbunden sind, aber nicht das Hören der Prozesse

der Befehl (in cmd Shell) für den Port 9001 lautet:

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

findstr :

  • r steht für Ausdrücke und c für die exakte Übereinstimmung der Kette.
  • [] * ist für übereinstimmende Leerzeichen

netstat :

  • a -> alle
  • n -> nicht auflösen (schneller)
  • o -> pid

Es funktioniert, weil netstat den Quellport, dann den Zielport und dann ESTABLISHED ausgibt

2
Boop

Wenn Sie den Prozess beenden möchten, der Port 8080 überwacht, können Sie PowerShell verwenden. Kombinieren Sie einfach Get-NetTCPConnection cmdlet mit Stop-Process .

Getestet und sollte mit PowerShell 5 unter Windows 10 oder Windows Server 2016 funktionieren. Ich denke jedoch, dass dies auch auf älteren Windows-Versionen mit PowerShell 5 funktionieren sollte.

Hier ist ein Beispiel:

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"):
1
bahrep

Wenn jemand nach einem Powershell-Skript sucht:

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)
    }
}

Diese Funktion erfüllt im Wesentlichen die Funktionen der oben genannten Funktionen. Sie haben jedoch das Powershell-Skriptformat, sodass Sie es zu Ihrem Powershell-Profil hinzufügen können. Um den Standort Ihres Profils zu finden, gehen Sie zu Powershell und geben Sie echo $profile ein.

0
watzon

Erstellen Sie eine Bat-Datei mit dem folgenden Inhalt. Sie akzeptiert die Eingabe für die Portnummer

@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

Klicken Sie abschließend auf "Enter", um den Vorgang zu beenden.

0

Fügen Sie dies in die Befehlszeile ein

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

Wenn Sie es in einem Stapel verwenden möchten, ist pu %%P anstelle von %P

0

Schritte:

  1. Wechseln Sie in den conf-Ordner Ihres Apache Tomcat Servers. In meinem Fall ist es Apache-Tomcat-7.0.61\conf, da ich Apache-Tomcat-7.0.61 verwende

  2. Öffnen Sie server.xml und ändern Sie die Portnummer von 8080 nach Belieben in einen anderen Port. Zum Beispiel: 8081.8082.8087 usw

  3. Gehen Sie jetzt zum Ordner bin und führen Sie shutdown.bat aus.

  4. Starten Sie nun den Server über Eclipse neu. 

Jetzt funktioniert Ihr Projekt ohne Unterbrechung.

0
Vineetha Swathi

Ähnlich wie bei Merlyn, aber auch hier werden folgende Fälle behandelt:

  • Bei der Portnummer handelt es sich eigentlich um einen linken Teilstring einer anderen längeren Portnummer .__, die Sie nicht suchen. Sie möchten nach einer exact - Portnummer suchen, um einen zufälligen, unschuldigen Prozess nicht zu beenden!
  • Der Skriptcode muss mehrmals ausgeführt werden können und jedes Mal korrekt sein. Es dürfen keine älteren, falschen Antworten angezeigt werden.

Hier ist es:

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
Yavin5

wenn Sie von System aus können Sie die Aufgabe nicht beenden. Versuchen Sie diesen Befehl

x:> net stop http/y

0