2012-03-24 14 views
64

Wie der Titel sagt, ich mehrere Server laufen, und jeder von ihnen hat die gleiche name aber andere PID und die port Nummer. Ich möchte die PID des Servers, der auf einem bestimmten Port überwacht, übereinstimmen, und dann möchte ich diesen Prozess beenden. Ich brauche das, um mein Bash-Skript zu vervollständigen.Ermitteln Sie den Prozess pid auf einem bestimmten Port hören

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

Antwort

90

Die -p Flagge von netstat gibt Ihnen PID des Prozesses:

netstat -l -p 

Edit: Der Befehl, der PIDs der Socket-Benutzer zu bekommen in FreeBSD benötigt wird sockstat ist. Wie wir während der Diskussion mit @Cyclone ausgearbeitet, die Linie, die die Arbeit erledigt ist:

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

"netstat: 80: unbekanntes oder nicht instrumentiertes Protokoll" verwendete den "80" (nginx) -Port zum Testen von Purpos. Nicht funktioniert. – Cyclone

+0

Wie haben Sie diesen Fehler erhalten? Welcher genaue Befehl hat es hervorgebracht? – stanwise

+0

'netstat -l -p 80', wenn ich' netstat -l -p' mache, bekomme ich das Handbuch: http://pastebin.com/raw.php?i=q9jeQSBj – Cyclone

7

netstat -nlp sollte Ihnen die PID sagen, was an welchem ​​Port abgehört wird.

+1

'netstat: 80: unbekannt oder uninstrumentierten protocol' benutzte den Port '80' (nginx) zum Testen von Purpos. Nicht funktioniert. – Cyclone

106

Short-Version, die Sie Befehl passieren kann zu töten:

lsof -i:80 -t 
+4

Dies umfasst auch Prozesse, die _connected_ an diesem Port sind. 'lsof -i4TCP: 80 -sTCP: LISTEN -t 'ist wahrscheinlich das, was Sie wollen. – Nevir

+0

Genau das, was ich gesucht habe. Ich wollte einen Prozess beenden, indem ich nach dem Port suche, auf dem er läuft. – mythicalcoder

+0

@Nevir Was meinen Sie mit "schließt auch Prozesse ein, die an diesem Port angeschlossen sind"? Kannst du bitte Erklären? – kishorer747

8

netstat -p -l | grep $PORT und lsof -i :$PORT Lösungen sind gut aber ich bevor fuser $PORT/tcp Erweiterung Syntax POSIX (die für coreutils arbeiten), wie mit Rohr:

pid=`fuser $PORT/tcp` 

es druckt pure pid, so können Sie sed magic out fallen lassen.

Eine Sache, die fuser mein Geliebter Tools macht Fähigkeit ist das Signal zu diesem Prozess direkt zu senden (diese Syntax ist auch Erweiterung POSIX):

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

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

1

Da sockstat nicht nativ auf meinem Rechner installiert wurde gehackt ich stanwise Antwort auf netstat stattdessen 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"" 
1

ich möchte Ed auf programmgesteuert - mit nur Bash - töten den Prozess auf einen bestimmten Port hören.

Sagen wir der Port 8089, dann ist hier, wie ich es tat:

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

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

+0

Hier ist die Funktion, die ich verwende, um es zu tun: 'Funktion kill-Listener { lsof -i: $ 1-t | xargs kill -9 } ' Verwenden Sie Ihr Beispiel für Port 8089:' Kill-Listener 8089' –

0

auf Fenster, die netstat Option, um die PIDs zu bekommen, ist -o und -p wählt einen Protokollfilter, ex .: netstat -a -p tcp -o