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.
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!