Como encontrar o PID de um processo que está usando uma porta no Linux? [4 maneiras]

Nesse artigo você irá conhecer 4 maneiras de listar os processos e PIDs que estão escutando uma determinada porta.

Como encontrar o PID de um processo que está usando uma porta no Linux? [4 maneiras]
🟡
Nível: Intermediário
Pré-requisitos: Conhecimentos básicos de processos, redes e protocolos de rede.
TL;DR ↪ Se você precisar apenas dos comandos, clique aqui para rolar a página direto para o resumo TL;DR!

📖 Índice

Eu diria que praticamente todos os profissionais de infra, em algum momento já precisaram identificar qual é o processo que está escutando ou ocupando determinada porta em um servidor Linux. As vezes até local mesmo, em um ambiente de testes.

Existem várias maneiras de se fazer isso e nesse artigo compilei 4 maneiras de identificar o processo que está ocupando uma determinada porta no Linux.

Pré-requisitos

É importante destacar que, em ambientes Linux, apenas o dono do processo ou o root consegue ver os detalhes do processo e efetivamente executar alguma ação. Sendo assim, consideramos que você tenha acesso root nesse contexto.

Como listar processos e portas com o NETSTAT?

Esse comando é para os que já estão a algum tempo no campo de batalha 🙂. O   netstat é um comando muito útil que faz parte do pacote Net-tools. Ele já teve seus dias de glória, entretanto, como o pacote Net-tools não é atualizado desde 2011 ele já foi marcado como obsoleto.

Ainda sim, é uma ferramenta muito útil para listagem de processos, então vamos começar por ele.

Para usar o netstat para identificar portas, você precisa utilizar os parâmetros  -tlunp . A minha dia é usar a combinação dos parâmetros nessa ordem, assim fica fácil lembrar: "netstat tlunp!".

Em seguida, basta utilizar um  | grep ":PORTA"  para buscar efetivamente o processo que está utilizando a porta. Observe que, a ultima coluna é o PID/Nome do processo.

# Comando com os parâmetros tlunp
sudo netstat -tlunp | grep 80

# Output
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      556/nginx: master p 
tcp6       0      0 :::80                   :::*                    LISTEN      556/nginx: master p 

Ok, mas para queservem os parâmetros tlunp?

Parâmetros Para que serve?
-t Exibe as conexões TCP
-l Exibe apenas processos que estão Listening
-u Exibe as conexões UDP
-n Exibe o endereço IP numerico
-p Exibe o PID e o nome do processo

Como listar processos e portas com o SS?

O comando ss  é a alternativa moderna para nosso querido netstat . O funcionamento e parâmetros são muito parecidos, inclusive, utilizamos o mesmo  -tlunp  para obter as portas, PIDs e nomes dos processos.

Você pode utilizar o  ss de duas maneiras, ou filtrando via | grep ":PORTA"  assim como fizemos no netstat ou então usando o próprio parâmetro de sport do ss. Eu fiz os dois exemplos de uso. Pessoalmente prefico usar o grep sempre.

# Comando ss utilizando o filtro source port
sudo ss -tlunp 'sport = :80'

# Output
Netid             State              Recv-Q              Send-Q                           Local Address:Port                           Peer Address:Port             Process                                                                                                                                                              
tcp               LISTEN             0                   511                                    0.0.0.0:80                                  0.0.0.0:*                 users:(("nginx",pid=560,fd=8),("nginx",pid=559,fd=8),("nginx",pid=558,fd=8),("nginx",pid=557,fd=8),("nginx",pid=556,fd=8))                                          
tcp               LISTEN             0                   511                                       [::]:80                                     [::]:*                 users:(("nginx",pid=560,fd=9),("nginx",pid=559,fd=9),("nginx",pid=558,fd=9),("nginx",pid=557,fd=9),("nginx",pid=556,fd=9))   


# Comando ss utilizando filtro pelo | grep
sudo ss -tlunp | grep :80

# Output
tcp   LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=560,fd=8),("nginx",pid=559,fd=8),("nginx",pid=558,fd=8),("nginx",pid=557,fd=8),("nginx",pid=556,fd=8))
tcp   LISTEN 0      511             [::]:80            [::]:*    users:(("nginx",pid=560,fd=9),("nginx",pid=559,fd=9),("nginx",pid=558,fd=9),("nginx",pid=557,fd=9),("nginx",pid=556,fd=9))

Como listar processos e portas com o LSOF?

O comando lsof  também é outro muito comum e muito utilizado por administradores Linux. Temos um artigo que fala somente sobre arquivos abertos no Linux.

O uso lsof  é muito simples e, para o buscar uma porta aberta com ele, basta utilizar o parâmetro -i :PORTA  que ele irá listar os PIDs, processos e portas de uma forma até mais completa que o próprio ss e netstat.

# Comando lsof com o filtro de porta -i
sudo lsof -i :80

# Output
COMMAND PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   556     root    8u  IPv4    909      0t0  TCP *:http (LISTEN)
nginx   556     root    9u  IPv6    910      0t0  TCP *:http (LISTEN)
nginx   557 www-data    8u  IPv4    909      0t0  TCP *:http (LISTEN)
nginx   557 www-data    9u  IPv6    910      0t0  TCP *:http (LISTEN)
nginx   558 www-data    8u  IPv4    909      0t0  TCP *:http (LISTEN)
nginx   558 www-data    9u  IPv6    910      0t0  TCP *:http (LISTEN)
nginx   559 www-data    8u  IPv4    909      0t0  TCP *:http (LISTEN)
nginx   559 www-data    9u  IPv6    910      0t0  TCP *:http (LISTEN)
nginx   560 www-data    8u  IPv4    909      0t0  TCP *:http (LISTEN)
nginx   560 www-data    9u  IPv6    910      0t0  TCP *:http (LISTEN)

Como listar processos e portas com o FUSER?

Das 3 opções anteriores, é possível que o comando fuser seja o menos comum de todos. Ele serve para exibir informações de processos e os usos de arquivos. Se você quiser APENAS o PID dos processos de uma determinada porta, sem dúvidas o fuser é a escolha certa.

O uso fuser  é também muito simples e, para o buscar uma porta aberta com ele, basta utilizar o parâmetro -v PORTA/PROTOCOLO  que ele irá listar os PIDs, processos e portas. O parâmetro -v é um verbose para retornar mais informações. Você pode também utilizar direto buscando a porta.

# Comando fuser com verbose e filtro de porta
sudo fuser -v 80/tcp

# Output
                     USER        PID ACCESS COMMAND
80/tcp:              root        556 F.... nginx
                     www-data    557 F.... nginx
                     www-data    558 F.... nginx
                     www-data    559 F.... nginx
                     www-data    560 F.... nginx
                     
                     
# Comando fuser de maneira super simplificada, APENAS PIDs
sudo fuser 80/tcp

# Output
80/tcp:                556   557   558   559   560

TL;DR | Resumo

# 4 formas de listar processos e PIDs de uma determinada porta.

# Comando netstat com os parâmetros tlunp
sudo netstat -tlunp | grep 80

# Comando ss com o filtro source port
sudo ss -tlunp 'sport = :80'

# Comando lsof com o filtro de porta -i
sudo lsof -i :80

# Comando fuser em modo vrbose com a porta/protocolo
sudo fuser -v 80/tcp

Espero que essa dica tenha sido útil, valeu!