Determinando qual processo está vinculado a uma porta

90

Eu sei que usando o comando:

lsof -i TCP 

(ou alguma variante de parâmetros com lsof) Posso determinar qual processo está vinculado a uma porta específica. Isso é útil, se estou tentando iniciar algo que deseja vincular ao 8080 e alguma outra pessoa já está usando essa porta, mas não sei o quê.

Existe uma maneira fácil de fazer isso sem usar lsof? Passo tempo trabalhando em muitos sistemas e lsof geralmente não é instalado.

Gilles
fonte

Respostas:

112

netstat -lnplistará o nome do pid e do processo ao lado de cada porta de escuta. Isso funcionará no Linux, mas não em todos os outros (como AIX.) Adicione -tse você desejar apenas 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
fonte
Legal, obrigado. Parece que funciona no RHEL, mas não no Solaris (como você indicou). Alguém sabe se há algo semelhante para o Solaris?
netstat -pacima é o meu voto. também olhe lsof.
Ricos Homolka
Como um aparte, para janelas é semelhante: netstat -aon | mais
Jonathan
E o SCTP?
Sudo
12

No AIX, netstat & rmsock podem ser usados ​​para determinar a ligação do processo:

[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
fonte
11
Obrigado por isso! Existe uma maneira, no entanto, apenas exibir qual processo escuta no soquete (em vez de usar o rmsock que tenta removê-lo)?
Olivier Dulac
2
@OlivierDulac: "Ao contrário do que o nome indica, o rmsock não remove o soquete, se estiver sendo usado por um processo. Apenas relata o processo que contém o soquete." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py
@ vitor-braga: Ah, thx! Eu pensei que estava tentando, mas apenas disse que processo se mantém quando não pode removê-lo. Aparentemente, ele nem tenta removê-lo quando um processo o mantém. Isso é legal! Valeu!
Olivier Dulac 26/09
8

Outra ferramenta disponível no Linux é ss . Na página de manual do ss no 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.

Exemplo de saída abaixo - a coluna final mostra a ligação do processo:

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

Para Solaris, você pode usar pfiles e depois grep por sockname:ou port:.

Uma amostra ( daqui ):

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

Uma vez me deparei com a tentativa de determinar qual processo estava por trás de uma porta específica (desta vez, eram 8000). Tentei uma variedade de lsof e netstat, mas aproveitei a oportunidade e tentei acessar a porta através de um navegador (por exemplo, http: // hostname: 8000 / ). Eis que uma tela inicial me cumprimentou e ficou óbvio qual era o processo (para o registro, era Splunk ).

Mais um pensamento: "ps -e -o pid, args" (YMMV) às vezes pode mostrar o número da porta na lista de argumentos. Grep é seu amigo!

rickumali
fonte
Na mesma linha, você pode telnet hostname 8000ver se o servidor imprime um banner. No entanto, isso é útil principalmente quando o servidor está sendo executado em uma máquina em que você não tem acesso ao shell e, em seguida, encontrar o ID do processo não é relevante.
Gilles