Encontrando o PID do processo usando uma porta específica?

392

Estou instalando o hadoop no meu sistema Ubuntu. Quando inicio, ele informa que a porta 9000 está ocupada.

Eu usei:

netstat -nlp|grep 9000

para ver se existe essa porta e eu consegui isso:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Mas como posso obter o PID do processo que o está mantendo?

wuchang
fonte
netstatO comando pode funcionar em muitos sistemas operacionais para permitir isso, basta encontrar os argumentos que garantirão que ele mostre pids ao longo de cada porta aberta conhecida.
Luciano

Respostas:

474

No Linux, você deve ser o root ou o proprietário do processo para obter as informações que deseja. Como tal, para processos em execução como outro usuário, a pré sudo- anexação é o que você precisa. Além disso, nos modernos sistemas Linux, ssexiste uma ferramenta para fazer isso:

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

Você também pode usar a mesma chamada que está usando no momento, mas lembre-se de sudo:

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

Você também pode 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
fonte
36
Nota: no OSX, a -popção é para protocolo e não para processo. Veja esta pergunta
Bryan P
3
@BryanP o OP pediu Ubuntu de modo que é meio irrelevante ...
Adam B
43
@AdamB A menos que um usuário do Mac tenha chegado aqui procurando porFinding the PID of the process using a specific port
mraaroncruz 10/10
2
Essa resposta provavelmente seria melhorada, colocando a necessidade sudono topo.
Nacht
2
@MrOnyancha Use as opções concha (-t) - #lsof -ti tcp:80
Mohnish 19/17
138

Além disso, você pode usar o lsofutilitário. Precisa 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)
Vitaliy
fonte
9
Este comando também fornecerá processos com establishedconexões, não apenas processos que são listening.
precisa saber é o seguinte
1
Não necessariamente para ser raiz. E, para aqueles que desejam obter apenas PID, você pode lsof -i :25 -Fp, o que produz resultados semelhantes p1234.
Robert
12

Eu estou usando "CentOS 7 mínima", que tem nem netstatnem lsof. Mas muitas distribuições Linux têm o comando socket statistics (ie ss).

Aqui está um exemplo de execução:

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

A execução do comando sudodaria a você o PID. Na minha máquina de desenvolvimento, recebo:

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

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

E, como mencionado em outras respostas, você também pode usar ssos lsofcomandos ou .

isapir
fonte
comando executado como sudoID do processo de exibição
Eugen Konkov
Mas e se sudo netstat -nlp | grep 34157ainda for exibido em -vez de PID?
Eugen Konkov
8

Também você pode usar fuser:

fuser -v -n tcp 22

A saída :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
fonte
Ele não trabalha fusor -v tcp -n 80 , mesmo tento com sudo
SuperKrish
1
Nota: Isso requer sudoque o processo sudo
incorreto
1
É uma coisa boa a lembrar em geral. Os comandos no Linux geralmente não fornecem informações sobre processos iniciados pelo root / sudo, a menos que o comando seja executado com o Sudo. Isso é verdade mesmo quando o comando normalmente não precisa do sudo para funcionar corretamente.
Njfife 6/07