Bestimmen, welcher Prozess an einen Port gebunden ist

90

Ich kenne das mit dem Befehl:

lsof -i TCP 

(oder eine Variante von Parametern mit lsof) Ich kann bestimmen, welcher Prozess an einen bestimmten Port gebunden ist. Dies ist nützlich, wenn ich versuche, etwas zu starten, das an 8080 gebunden werden soll, und ein anderer Benutzer diesen Port bereits verwendet, aber ich weiß nicht, was.

Gibt es eine einfache Möglichkeit, dies ohne Verwendung von lsof zu tun? Ich verbringe viel Zeit damit, an vielen Systemen zu arbeiten, und oftmals ist lsof nicht installiert.

Gilles
quelle

Antworten:

112

netstat -lnplistet die pid und den Prozessnamen neben jedem Überwachungsport auf. Dies funktioniert unter Linux, aber nicht bei allen anderen (wie AIX.). Fügen -tSie hinzu, wenn Sie nur TCP möchten.

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named

usw.

Cakemox
quelle
Cool, danke. Sieht so aus, als würde das unter RHEL funktionieren, aber nicht unter Solaris (wie Sie angegeben haben). Weiß jemand, ob es für Solaris etwas Ähnliches gibt?
netstat -poben ist meine Stimme. siehe auch lsof.
Rich Homolka
Abgesehen davon ist es für Windows ähnlich: netstat -aon | more
Jonathan
Was ist mit SCTP?
sudo
12

Unter AIX kann mit netstat & rmsock die Prozessbindung bestimmt werden:

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).
frielp
quelle
1
Danke dafür! Gibt es jedoch eine Möglichkeit, nur anzuzeigen, welcher Prozess den Socket überwacht (anstatt rmsock zu verwenden, um ihn zu entfernen)?
Olivier Dulac
2
@OlivierDulac: "Anders als der Name andeutet, entfernt rmsock den Socket nicht, wenn er von einem Prozess verwendet wird. Es wird nur der Prozess gemeldet, der den Socket enthält." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py
@ vitor-braga: Ah thx! Ich dachte, es würde versucht, sagte aber nur, welcher Prozess anhält, wenn er nicht entfernt werden konnte. Anscheinend versucht es nicht einmal, es zu entfernen, wenn ein Prozess es anhält. Das ist cool! Vielen Dank!
Olivier Dulac
8

Ein weiteres unter Linux verfügbares Tool ist ss . Von der SS- Manpage auf Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

Beispielausgabe unten - die letzte Spalte zeigt die Prozessbindung:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))
frielp
quelle
3

Für Solaris können Sie pfiles verwenden und dann nach sockname:oder greifenport: .

Ein Beispiel (von hier ):

pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:'
Eugen Constantin Dinca
quelle
2

Ich war einmal mit dem Versuch konfrontiert festzustellen, welcher Prozess sich hinter einem bestimmten Port befand (diesmal waren es 8000). Ich habe eine Vielzahl von lsof und netstat ausprobiert, dann aber die Gelegenheit genutzt und versucht, den Port über einen Browser (dh http: // hostname: 8000 / ) zu erreichen. Und siehe da, ein Begrüßungsbildschirm begrüßte mich und es wurde klar, wie der Prozess ablief (für die Aufzeichnung, es war Splunk ).

Noch ein Gedanke: "ps -e -o pid, args" (YMMV) kann manchmal die Portnummer in der Argumentliste anzeigen. Grep ist dein Freund!

Rickumali
quelle
In der gleichen Weise können Sie telnet hostname 8000sehen, ob der Server ein Banner druckt. Dies ist jedoch vor allem dann hilfreich, wenn der Server auf einem Computer ausgeführt wird, auf dem Sie keinen Shell-Zugriff haben, und die Prozess-ID dann nicht relevant ist.
Gilles