Determinare quale processo è associato a una porta


90

So che usando il comando:

lsof -i TCP 

(o qualche variante di parametri con lsof) Posso determinare quale processo è associato a una determinata porta. Questo è utile dire se sto cercando di avviare qualcosa che vuole legare a 8080 e qualcun altro sta già usando quella porta, ma non so cosa.

C'è un modo semplice per farlo senza usare lsof? Passo il tempo a lavorare su molti sistemi e spesso lsof non è installato.

Risposte:


112

netstat -lnpelencherà il pid e il nome del processo accanto a ciascuna porta di ascolto. Funzionerà sotto Linux, ma non tutti gli altri (come AIX.) Aggiungi -tse vuoi solo TCP.

# 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

eccetera.


Figo, grazie. Sembra che funzioni con RHEL, ma non con Solaris (come hai indicato). Qualcuno sa se c'è qualcosa di simile per Solaris?

netstat -psopra è il mio voto. guarda anche lsof.
Rich Homolka,

A parte questo, per Windows è simile: netstat -aon | altro
Jonathan,

Che dire di SCTP?
sudo,

12

Su AIX, netstat & rmsock possono essere utilizzati per determinare l'associazione al processo:

[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).

1
Grazie per questo! C'è un modo, tuttavia, per visualizzare solo quale processo è in ascolto sul socket (invece di utilizzare rmsock che tenta di rimuoverlo)?
Olivier Dulac il

2
@OlivierDulac: "A differenza di ciò che suggerisce il nome, rmsock non rimuove il socket, se viene utilizzato da un processo. Segnala semplicemente il processo che contiene il socket." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py,

@ vitor-braga: Ah grazie! Pensavo ci stesse provando, ma ho appena detto quale processo si blocca quando non è stato possibile rimuoverlo. Apparentemente non prova nemmeno a rimuoverlo quando un processo lo tiene. Questo è figo! Grazie!
Olivier Dulac il

8

Un altro strumento disponibile su Linux è ss . Dalla pagina man di ss su 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.

Esempio di output di seguito: la colonna finale mostra l'associazione di processo:

[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))

3

Per Solaris è possibile utilizzare pfile e quindi grep con sockname:o port:.

Un campione (da qui ):

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

2

Una volta mi sono trovato di fronte al tentativo di determinare quale processo fosse dietro una determinata porta (questa volta erano 8000). Ho provato una varietà di lsof e netstat, ma poi ho colto l'occasione e ho provato a colpire la porta tramite un browser (ad esempio http: // nomehost: 8000 / ). Ecco, una schermata iniziale mi ha salutato, ed è diventato evidente quale fosse il processo (per la cronaca, era Splunk ).

Un altro pensiero: "ps -e -o pid, args" (YMMV) a volte può mostrare il numero di porta nell'elenco degli argomenti. Grep è tuo amico!


Allo stesso modo, è possibile telnet hostname 8000e vedere se il server stampa un banner. Tuttavia, ciò è utile soprattutto quando il server è in esecuzione su un computer in cui non si ha accesso alla shell e quindi trovare l'ID del processo non è rilevante.
Gilles,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.