Cómo identificar el proceso que está usando un puerto TCP determinado

Seguro que ya os ha pasado, al iniciar un servicio (o una shell }:-)) falla porque hay otro proceso que ya levantó anteriormente el mismo puerto TCP...

Para encontrar rápidamente que proceso está usando el puerto en cuestión lo más fácil y recurrente es usar el comando "netstat" y bueno... vi una breve entrada en la wiki de SAP y siempre está bien tener una chuleta a mano en el blog... :-P

LINUX:
> netstat -nepal|grep 8080
tcp 0 0 :::8080 :::* LISTEN 10404 18906159 7952/java

En este primer ejemplo (Linux) vemos que el proceso con PID 7952 (java) está usando el puerto TCP 8080.

WINDOWS:
> netstat -nao|findstr 8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 3696
TCP []:8080 []:0 LISTENING 3696

En este ejemplo en Windows, encontramos que el proceso con PID 3696 es el que tiene ocupado el puerto (8080).

También es posible usar en Windows "netstat -ab" que mostrará todos los procesos asociados al puerto. La opción "a" lista todas las conexiones y la opción "b" muestra el ejecutable correspondiente.

AIX:
> netstat -Aan | grep 8000 | grep LISTEN
f1000e000130bbb8 tcp4       0      0  *.8000                *.*                   LISTEN
> rmsock f1000e000130bbb8 tcpcb
The socket 0xf1000e000130b808 is being held by proccess 13893704 (icman).
> ps -ef | grep 13893704
  vmcadm 13893704  9175156   0   Dec 22      -  0:17 icman -attach pf=/usr/sap/VMC/SYS/profile/VMC_DVEBMGS00_is4039

SOLARIS:
> ps -ef| awk '{print $2}'| xargs -I '{}' sh -c 'echo Verifying PID {}; pfiles {} 2>/dev/null|grep "port: 3900"|grep -v grep'
(...)
Verifying PID 3150
Verifying PID 4848
Verifying PID 4891
Verifying PID 7900
   sockname: AF_INET 0.0.0.0  port: 3900
Verifying PID 4831
Verifying PID 23568
Verifying PID 7928
Verifying PID 9662
(...)
> ps -ef|grep 7900|grep -v grep
  qpkadm  7900  7840   0   Jun 21 ?           1:38 ms.sapQPK_DVEBMGS00 pf=/usr/sap/QPK/SYS/profile/QPK_DVEBMGS00_fs4400

El primer comando mostrará la lista con el PID de todos los procesos activos en el sistema. El número de puerto debe ser indicado con el comando "grep".

El PID que está usando el puerto será el inmediatamente anterior a la línea que termina en "port: " ("port: 3900" en el ejemplo anterior).

El segundo comando mostrará la informacion del proceso en sí mismo.

Fuente: https://wiki.scn.sap.com/wiki/display/SI/How+to+find+the+process+binding+a+TCP+port

Comentarios

  1. Hola Vicente,
    También con lsof puedes conseguir informacion, por ejemplo:
    lsof -i :80

    Saludos y enhorabuena por el blog.

    ResponderEliminar
    Respuestas
    1. Hola Toni, lsof lo conocía pero solo está en Linux/Unix (para Windows tendrias que usar tcpview o similar). El caso es que netstat es más "universal".

      Gracias y saludos!

      Eliminar
  2. A modo de mnemotecnia me aprendí, para Windows, el "netstat -ano".

    ResponderEliminar
  3. También está fuser 80\tcp , me solo para entornos linux

    ResponderEliminar
  4. Muy bueno. Solo añadir: Con ls se puede saber la ruta del proceso.

    Visto aquí: https://www.sysadmit.com/2018/06/linux-que-proceso-usa-un-puerto.html

    ResponderEliminar

Publicar un comentario