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.

Zyklon
quelle

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
stanwise
quelle
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
Laurynas
quelle
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

Gavenkoa
quelle
1
fuser uns ordentlicher und prägnanter
Dawoodjee
10

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


quelle
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""
dafky2000
quelle
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.

Glavin001
quelle
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.

Debashish Sen.
quelle
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

Jan Wilmans
quelle