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

127

Was kann unter Windows nach Port 8080 suchen und versuchen, den verwendeten Prozess über eine .BAT-Datei abzubrechen?

Mike Flynn
quelle
Ich kann Ihnen einen Teil des Weges dorthin bringen ... Verwenden Sie an der Eingabeaufforderung den Befehl 'netstat -a -n -o', und Sie sehen eine Liste der Prozesse und der Ports, die sie abhören (sowie IP und ob Sie sind mit einer anderen IP verbunden oder nicht.) Von unschätzbarem Wert. Es wird mit ziemlicher Sicherheit schönere Schalter geben, um die Ergebnisse zu verfeinern, aber ich kann mich nicht sofort an sie erinnern ... Hoffentlich kann jemand darauf aufbauen?
Dave
Unter Linux können Sie. Wenn Sie Cygwin installieren, können Sie auch in Fledermaus
Dani
@Dani, Mike: Cygwin ist eine große Abhängigkeit und nicht erforderlich, um dieses Problem zu lösen. Wenn Sie es jedoch bereits haben, verwenden Sie es - Linux-Befehlszeilentools sind viel besser.
Merlyn Morgan-Graham

Antworten:

141

Hier ist ein Befehl, mit dem Sie loslegen können:

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

Wenn Sie mit Ihrer Batch-Datei vertraut sind, entfernen Sie 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 verschiedene Betriebssysteme geringfügig ändern müssen. Unter Windows 7 benötigen Sie beispielsweise möglicherweise tokens=5anstelle von tokens=4.

Wie das funktioniert

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

Auf diese Weise können Sie die commandAusgabe ausführen und durchlaufen. Jede Zeile wird eingefügt %variableund kann beliebig oft erweitert werden otherCommand, wo immer Sie möchten. %variableim tatsächlichen Gebrauch kann nur ein einzelner Buchstabe Name haben, z %V.

"tokens=4 delims= "

Auf diese Weise können Sie jede Zeile nach Leerzeichen aufteilen, den 4. Block in dieser Zeile nehmen und ihn %variable(in unserem Fall %%P) einfügen . delimssieht leer aus, aber dieser zusätzliche Platz ist tatsächlich von Bedeutung.

netstat -a -n -o

Führen Sie es einfach aus und finden Sie es heraus. Gemäß der Befehlszeilenhilfe werden "Alle Verbindungen und Überwachungsports angezeigt", "Adressen und Portnummern in numerischer Form angezeigt" und "Die jeder Verbindung zugeordnete Prozess-ID angezeigt". Ich habe diese Optionen nur verwendet, da jemand anderes sie vorgeschlagen hat und sie zufällig funktioniert haben :)

^|

Dies nimmt die Ausgabe des ersten Befehls oder Programms ( netstat) und übergibt sie an ein zweites Befehlsprogramm ( findstr). Wenn Sie dies direkt in der Befehlszeile anstelle einer Befehlszeichenfolge verwenden würden, würden Sie |stattdessen verwenden ^|.

findstr :8080

Dies filtert alle Ausgaben, die an sie übergeben werden, und gibt nur Zeilen zurück, die enthalten :8080.

TaskKill.exe /PID <value>

Dadurch wird eine laufende Aufgabe unter Verwendung der Prozess-ID beendet.

%%P instead of %P

Dies ist in Batch-Dateien erforderlich. Wenn Sie dies an der Eingabeaufforderung tun würden, würden Sie %Pstattdessen verwenden.

Merlyn Morgan-Graham
quelle
Sie müssen möglicherweise mit Token, delims usw. Überprüfen Sie spielen HELP FORauf der Kommandozeile eine Menge anderer Möglichkeiten , um zu sehen , die FORSie geben, und prüfen Sie netstat -?, findstr /?und TaskKill /?noch mehr Hilfe.
Merlyn Morgan-Graham
Ich werde es ausprobieren und mich bei Ihnen melden.
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
Das ist toll. tokens=4ist Windows XP, denke ich, und tokens=5Windows 7. Auch eine gute Idee, /Fum den Kill zu erzwingen.
Strelok
1
@ MerlynMorgan-Graham, da dies eine akzeptierte Antwort ist, fügen Sie bitte auch Punkte von stackoverflow.com/a/20637662/5243762 zu dieser Antwort hinzu
IAmSurajBobade
196

Ö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

Mohit Singh
quelle
Ja, das wird überall anders sein
Mohit Singh
3
sehr hilfreich ! Wohlgemerkt, ich suche nach: 3000 statt 0.0: 3000, weil es unter 127.0.01 statt 0.0.0.0 sein könnte
Leeeeeeelo
2
Vielen Dank, tolle Arbeit, eine außer Kontrolle geratene Webpack-Entwicklungsaufgabe zu töten :)
Danjah
Oder Sie geben einfach netstat -ano | an findstr: 9797 taskkill / PID typeyourPIDhere / F Hier ist 9797 die Portnummer. Ich verwende diesen Befehl häufig, um den fehlerhaften / gehängten Server zu beenden.
Mohit Singh
52

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

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

taskkill /pid 21424 /F 
Girdhar Singh Rathore
quelle
@EralpB Viel Spaß :)
Girdhar Singh Rathore
19

Durch die Verwendung der Merlyn-Lösung wurden andere Anwendungen wie Firefox beendet. Diese Prozesse verwendeten denselben 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

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

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

Gehen Sie wie folgt vor, um alle auf Port 8080 ausgeführten Prozesse aufzulisten.

netstat -ano | finde "8080"

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

Führen Sie dann den folgenden Befehl aus, um den Prozess abzubrechen

Taskkill / F / PID 10612

Sardesh Sharma
quelle
13

Vielen Dank an alle, nur um hinzuzufügen, dass einige Prozesse nicht geschlossen werden, es sei denn, der / F-Force-Schalter wird auch 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 abzurufen und Folgendes auszuführen:

sc stop ServiceName

xtrm
quelle
2

Nur zur Vervollständigung:

Ich wollte alle Prozesse beenden, die mit einem bestimmten Port verbunden sind, aber nicht den Prozess, der abhört

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 genaue Übereinstimmung der Kette.
  • [] * dient zum Abgleichen von Leerzeichen

netstat :

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

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

Boop
quelle
2

Erstellt eine Bat-Datei mit dem folgenden Inhalt, akzeptiert sie 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.

Sireesh Yarlagadda
quelle
@TusharPandey Dies ist eine Frage mit Windows-Tags, es handelt sich also um ein Windows-Skript, nicht um ein Shell-Skript
Sireesh Yarlagadda,
1

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

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

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

Ähnlich wie Merlyns Antwort, aber diese behandelt auch diese Fälle:

  • Die Portnummer ist eigentlich eine linke Teilzeichenfolge einer anderen längeren Portnummer, nach der Sie nicht suchen. Sie möchten nach einer genauen Portnummer suchen , damit Sie keinen zufälligen, unschuldigen Prozess beenden!
  • Der Skriptcode muss mehr als einmal ausgeführt werden können und jedes Mal korrekt sein, ohne dass ältere, falsche 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.
)
Yavin5
quelle
0

Schritte:

  1. Wechseln Sie in den confOrdner Ihres Apache Tomcat- Servers. In meinem Fall ist es so, apache-tomcat-7.0.61\confwie ich Apache-Tomcat-7.0.61 verwende

  2. Öffnen Sie server.xmldie Portnummer und ändern Sie sie nach Ihren Wünschen von 8080 auf einen anderen Port. Zum Beispiel: 8081,8082,8087 usw.

  3. Gehen Sie nun zum binOrdner und führen Sie ihn ausshutdown.bat

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

Jetzt funktioniert Ihr Projekt ohne Unterbrechung.

Vineetha Swathi
quelle
0

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 macht im Grunde das, was die oben genannten Funktionen tun, aber sie hat das Powershell-Skriptformat, sodass Sie sie Ihrem Powershell-Profil hinzufügen können. Um den Standort Ihres Profils zu finden, gehen Sie zu Powershell und geben Sie einecho $profile

Watzon
quelle
1
Dies ist nicht wirklich ein PowerShell-Skript, sondern ein PowerShell-basierter Wrapper-Around- netstatTool.
Bahrep
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 einer Batch-Pu %%Panstelle von verwenden möchten%P

Eduard Florinescu
quelle
Dies hängt von der Sprache des Betriebssystems ab. Wie funktioniert es für alle Sprachen?
Jakob
@Jakob Dies kann nur im cmd-Terminal unter Windows ausgeführt werden, auch nur in .cmd- oder .bat-Dateien
Eduard Florinescu
Ja, aber nur in englischer Sprache, da sonst "LISTENING" in die Sprache des Betriebssystems übersetzt wird.
Jakob
@ Jakob Mir ist nicht bekannt, dass das netstatTool in andere Sprachen übersetzt wurde
Eduard Florinescu
0

Wenn Sie nach System sind, können Sie die Aufgabe nicht beenden. Versuchen Sie diesen Befehl

x:> net stop http / y

Nrawut Phrommahit
quelle
3
Was bedeutet "wenn Sie nach System"? Und wie ist diese Antwort besser als alle anderen?
Nico Haase