Bestimmen Sie die Prozess-PID-Überwachung an einem bestimmten Port


101

Wie der Titel schon sagt, betreibe ich mehrere Spieleserver, und jeder von ihnen hat die gleiche, nameaber unterschiedliche PIDund die gleiche portNummer. Ich möchte mit PIDdem Server übereinstimmen, der einen bestimmten Port überwacht, und dann möchte ich diesen Prozess beenden. Ich brauche das, um mein Bash-Skript zu vervollständigen.

Ist das überhaupt möglich? Weil es im Web noch keine Lösungen gefunden hat.

Antworten:


125

Das -pFlag von netstatgibt Ihnen die PID des Prozesses an:

netstat -l -p

Bearbeiten: Der Befehl, der benötigt wird, um PIDs von Socket-Benutzern in FreeBSD abzurufen, lautet sockstat. Wie wir während der Diskussion mit @Cyclone herausgefunden haben, lautet die Zeile, die den Job erledigt:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80: unknown or uninstrumented protocolhat den 80(nginx) -Port zum Testen von Zwecken verwendet. Nicht funktioniert.
Zyklon

5
versuchen Sie es netstat -nlp | grep :80stattdessen
stanwise

12
netstat: option requires an argument -- p
Zyklon

2
@jasonbrittain Auf Cygwin wird Windows Native netstataufgerufen. Es hat eine andere Syntax.
Stanwise

2
Diese Antwort ist falsch: netstat: Option erfordert ein Argument - p
Gute Person

143

Kurzversion, die Sie an den Befehl kill übergeben können:

lsof -i:80 -t

13
Dies schließt auch Prozesse ein, die an diesem Port verbunden sind. lsof -i4TCP:80 -sTCP:LISTEN -tist wahrscheinlich das, was Sie stattdessen wollen.
Nevir

Genau das, wonach ich gesucht habe. Ich wollte einen Prozess beenden, indem ich nach dem Port suchte, an dem er ausgeführt wird.
Mythicalcoder

@Nevir was meinst du mit "schließt auch Prozesse ein, die an diesem Port verbunden sind"? Kannst du bitte Erklären?
kishorer747

2
kill -9 `lsof -i:80 -t`zum leichteren Kopieren
bmjrowe

17

netstat -p -l | grep $PORTund lsof -i :$PORT Lösungen sind gut, aber ich bevorzuge die fuser $PORT/tcpErweiterungssyntax gegenüber POSIX (die funktionieren coreutils) wie bei Pipe:

pid=`fuser $PORT/tcp`

Es druckt reine PID, damit Sie sedMagie herausfallen lassen können.

Eine Sache, die fusermeine Liebhaber-Tools ausmacht , ist die Fähigkeit, Signale direkt an diesen Prozess zu senden (diese Syntax ist auch eine Erweiterung von POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Außerdem wird -k von FreeBSD unterstützt: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser uns ordentlicher und prägnanter
Dawoodjee

10

netstat -nlp sollte Ihnen die PID darüber mitteilen, was an welchem ​​Port empfangsbereit ist.


1
netstat: 80: unknown or uninstrumented protocolhat den 80(nginx) -Port zum Testen von Zwecken verwendet. Nicht funktioniert.
Zyklon

3

Da sockstat nicht nativ auf meinem Computer installiert war, habe ich die Antwort von stanwise gehackt, um stattdessen netstat zu verwenden.

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

Ich wollte programmgesteuert - nur mit Bash - den Prozess beenden, der an einem bestimmten Port abhört.

Nehmen wir an, der Port ist 8089, dann habe ich es so gemacht:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

Ich hoffe das hilft jemand anderem! Ich weiß, dass es meinem Team helfen wird.


1
Hier ist die Funktion, die ich dazu benutze: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Am Beispiel von Port 8089:kill-listener 8089
Hurricane Hamilton

3

Syntax:

töte -9 $ (lsof -t -i: Portnummer)

Beispiel: Um den an Port 4200 ausgeführten Prozess abzubrechen, führen Sie den folgenden Befehl aus

kill -9 $(lsof -t -i:4200)

In Ubuntu getestet.


2

Unter Windows ist die Option netstat, um die PIDs abzurufen, -o und -p wählt einen Protokollfilter aus, z. B.: netstat -a -p tcp -o

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.