Determinar qué proceso está vinculado a un puerto

90

Sé que usando el comando:

lsof -i TCP 

(o alguna variante de parámetros con lsof) Puedo determinar qué proceso está vinculado a un puerto en particular. Esto es útil, por ejemplo, si estoy tratando de comenzar algo que quiere vincularse a 8080 y alguien más ya está usando ese puerto, pero no sé qué.

¿Hay una manera fácil de hacer esto sin usar lsof? Paso mucho tiempo trabajando en muchos sistemas y lsof a menudo no está instalado.

Gilles
fuente

Respuestas:

112

netstat -lnpenumerará el pid y el nombre del proceso al lado de cada puerto de escucha. Esto funcionará en Linux, pero no en todos los demás (como AIX). Agregue -tsi solo desea 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

etc.

Cakemox
fuente
Genial, gracias. Parece que funciona bajo RHEL, pero no bajo Solaris (como usted indicó). ¿Alguien sabe si hay algo similar para Solaris?
netstat -parriba está mi voto. También mira lsof.
Rich Homolka
Como comentario aparte, para Windows es similar: netstat -aon | más
Jonathan
¿Qué pasa con SCTP?
sudo
12

En AIX, netstat & rmsock se pueden utilizar para determinar el enlace del proceso:

[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
fuente
1
¡Gracias por esto! Sin embargo, ¿hay alguna manera de mostrar qué proceso escuchar en el socket (en lugar de usar rmsock que intenta eliminarlo)?
Olivier Dulac
2
@OlivierDulac: "A diferencia de lo que su nombre implica, rmsock no elimina el zócalo, si está siendo utilizado por un proceso. Simplemente informa el proceso que contiene el zócalo". ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py
@ vitor-braga: ¡Ah, gracias! Pensé que lo estaba intentando, pero solo dije qué proceso se cumple cuando no podía eliminarlo. Aparentemente, ni siquiera intenta eliminarlo cuando un proceso lo retiene. ¡Eso es genial! ¡Gracias!
Olivier Dulac
8

Otra herramienta disponible en Linux es ss . Desde la página de manual de ss en 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.

Ejemplo de salida a continuación: la columna final muestra el enlace del proceso:

[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
fuente
3

Para Solaris puede usar pfiles y luego grep por sockname:o port:.

Una muestra (de aquí ):

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

Una vez tuve que tratar de determinar qué proceso estaba detrás de un puerto en particular (esta vez era 8000). Probé una variedad de lsof y netstat, pero luego me arriesgué e intenté acceder al puerto a través de un navegador (es decir, http: // hostname: 8000 / ). He aquí, una pantalla de bienvenida me saludó, y se hizo evidente cuál era el proceso (para el registro, fue Splunk ).

Un pensamiento más: "ps -e -o pid, args" (YMMV) a veces puede mostrar el número de puerto en la lista de argumentos. Grep es tu amigo!

rickumali
fuente
En la misma línea, podría telnet hostname 8000ver si el servidor imprime un banner. Sin embargo, eso es sobre todo útil cuando el servidor se ejecuta en una máquina donde no tiene acceso de shell, y luego encontrar el ID del proceso no es relevante.
Gilles