Finden Sie die PID des Prozesses über einen bestimmten Port?

391

Ich installiere Hadoop auf meinem Ubuntu-System. Wenn ich es starte, wird gemeldet, dass Port 9000 belegt ist.

Ich benutzte:

netstat -nlp|grep 9000

um zu sehen, ob ein solcher Port existiert und ich habe dies:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Aber wie kann ich die PID des Prozesses erhalten, der es hält?

Wuchang
quelle
netstatDer Befehl funktioniert möglicherweise in vielen Betriebssystemen, um dies zu ermöglichen. Sie müssen nur die Argumente finden, die sicherstellen, dass PIDs an jedem bekannten, geöffneten Port angezeigt werden.
Luciano

Antworten:

474

Unter Linux müssen Sie root oder der Eigentümer des Prozesses sein, um die gewünschten Informationen zu erhalten. Als solche für Prozesse als ein anderer Benutzer ausgeführt wird , Prepending sudoist das meiste, was Sie brauchen. Darüber hinaus steht auf modernen Linux-Systemen das ssfolgende Tool zur Verfügung:

$ sudo ss -lptn 'sport = :80'
State   Local Address:Port  Peer Address:Port              
LISTEN  127.0.0.1:80        *:*                users:(("nginx",pid=125004,fd=12))
LISTEN  ::1:80              :::*               users:(("nginx",pid=125004,fd=11))

Sie können auch denselben Aufruf verwenden, den Sie gerade verwenden. Beachten Sie jedoch Folgendes sudo:

$ sudo netstat -nlp | grep :80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

Sie können auch lsof verwenden:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)
Chris Down
quelle
36
Hinweis: Unter OSX gilt die -pOption eher für das Protokoll als für den Prozess. Siehe diese Frage
Bryan P
3
@BryanP die OP nach Ubuntu gefragt, so ist das ein bisschen irrelevant ...
Adam B
43
@AdamB Es sei denn, ein Mac-Benutzer ist auf der Suche nachFinding the PID of the process using a specific port
mraaroncruz
2
Diese Antwort würde sich wahrscheinlich verbessern, indem man das Bedürfnis nach ganz sudooben setzt.
Nacht
2
@ MrOnyancha Verwenden Sie die knappen (-t) Optionen -lsof -ti tcp:80
Mohnish
138

Sie können auch das lsofDienstprogramm verwenden. Muss root sein.

# lsof -i :25
COMMAND  PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
exim4   2799 Debian-exim    3u  IPv4   6645      0t0  TCP localhost:smtp (LISTEN)
exim4   2799 Debian-exim    4u  IPv6   6646      0t0  TCP localhost:smtp (LISTEN)
Vitaliy
quelle
9
Mit diesem Befehl erhalten Sie auch Prozesse mit establishedVerbindungen, nicht nur Prozesse mit Verbindungen listening.
Firelynx
1
Nicht unbedingt root sein. Und für diejenigen, die nur PID erhalten möchten, können Sie lsof -i :25 -Fp, die Ausgabe wie erzeugt p1234.
Robert
12

Ich verwende "CentOS 7 minimal", was netstatweder noch hat lsof. Viele Linux-Distributionen haben jedoch den Befehl socket statistics (dh ss).

Hier ist ein Beispiel für die Ausführung:

# ss -tanp | grep 6379
LISTEN   0    128  127.0.0.1:6379   *:*   users:(("redis-server",pid=2531,fd=4))
Alexandr
quelle
1
Siehe auchss -pntl 'sport = :6379'
Stéphane Chazelas
10

Wenn Sie den Befehl mit sudoausführen, erhalten Sie die PID. Auf meiner Entwicklungsmaschine bekomme ich:

$ netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      -

$ sudo netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      16449/java

Und wie in anderen Antworten erwähnt, können Sie auch ssdie lsofBefehle oder verwenden .

Isapir
quelle
laufender Befehl als sudoAnzeigeprozess-ID
Eugen Konkov
Aber was ist, wenn sudo netstat -nlp | grep 34157immer noch -anstelle von PID angezeigt wird?
Eugen Konkov
8

Auch können Sie verwenden fuser:

fuser -v -n tcp 22

Die Ausgabe :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
quelle
Es funktioniert nicht Fixiereinheit -v -n TCP 80 , auch ich versuche es mit sudo
SuperKrish
1
Hinweis: Dies erfordert, sudodass der Prozess des sudo
Verstoßes
1
Dies ist eine gute Sache, an die man sich im Allgemeinen erinnert. Befehle unter Linux geben im Allgemeinen keine Informationen zu Prozessen, die von root / sudo gestartet wurden, es sei denn, der Befehl wird mit Sudo ausgeführt. Dies gilt auch dann, wenn der Befehl normalerweise nicht sudo benötigt, um korrekt ausgeführt zu werden.
NJFIFE