¿Encontrar el PID del proceso usando un puerto específico?

392

Estoy instalando hadoop en mi sistema Ubuntu. Cuando lo inicio, informa que el puerto 9000 está ocupado.

Solía:

netstat -nlp|grep 9000

para ver si existe ese puerto y obtuve esto:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Pero, ¿cómo puedo obtener el PID del proceso que lo retiene?

wuchang
fuente
Respondido en SU ​​- Encontrar el proceso que está usando un cierto puerto en Linux
Piotr Dobrogost
netstatEl comando podría funcionar en muchos sistemas operativos para permitirle obtener eso, solo tiene que encontrar los argumentos que garanticen que mostrará pids a lo largo de cada puerto abierto conocido.
Luciano

Respuestas:

474

En Linux, debe ser root o el propietario del proceso para obtener la información que desea. Como tal, para los procesos que se ejecutan como otro usuario, la preparación previa sudoes la mayoría de lo que necesita. Además de eso, en los sistemas Linux modernos, sses una herramienta para usar para hacer esto:

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

También puede usar la misma invocación que está usando actualmente, pero recuerde sudo:

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

También puedes usar lsof:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)
Chris Down
fuente
36
Nota: bajo OSX, la -popción es para protocolo en lugar de proceso. Ver esta pregunta
Bryan P
3
@BryanP, el OP pidió Ubuntu, así que eso es irrelevante ...
Adam B
43
@AdamB A menos que un usuario de Mac llegue aquí buscandoFinding the PID of the process using a specific port
mraaroncruz
2
Esta respuesta probablemente se mejoraría colocando la necesidad sudoen la parte superior.
Nacht
2
@MrOnyancha Use las opciones concisas (-t) -lsof -ti tcp:80
Mohnish
138

También puedes usar la lsofutilidad. Necesito ser root.

# 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)
Vital
fuente
99
Este comando también le dará procesos con establishedconexiones, no solo procesos que son listening.
firelynx
1
No necesariamente para ser root. Y, para aquellos que desean obtener solo PID, puede hacerlo, lo lsof -i :25 -Fpque produce resultados similares p1234.
Robert
12

Estoy usando "CentOS 7 minimal" que no tiene ni netstatninguno lsof. Pero muchas distribuciones de Linux tienen el comando de estadísticas de socket (es decir ss).

Aquí hay un ejemplo de ejecución:

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

Ejecutar el comando con sudole daría el PID. En mi máquina de desarrollo obtengo:

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

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

Y como se menciona en otras respuestas, también puede usar sslos lsofcomandos o .

isapir
fuente
comando en ejecución como sudoID de proceso de visualización
Eugen Konkov
Pero, ¿y si sudo netstat -nlp | grep 34157todavía se muestra en -lugar de PID?
Eugen Konkov
8

También puedes usar fuser:

fuser -v -n tcp 22

La salida :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
fuente
No funciona fuser -v -n tcp 80 , incluso lo intento con sudo
SuperKrish
1
Nota: Esto requiere sudosi el proceso ofensivo también se inició consudo
laggingreflex
1
Esto es algo bueno para recordar en general. Los comandos en Linux generalmente no proporcionarán información sobre los procesos iniciados por root / sudo a menos que el comando se ejecute con Sudo. Esto es cierto incluso cuando el comando normalmente no necesita sudo para ejecutarse correctamente.
njfife