Localizar (e matar) o processo de bloqueio da porta 3000 no Mac


1812

Como encontro (e mato) processos que escutam / usam minhas portas tcp? Estou no mac os x.

Às vezes, após uma falha ou algum bug, meu aplicativo Rails está bloqueando a porta 3000. Não consigo encontrá-lo usando o ps -ef ...

Ao fazer

rails server

eu recebo

Endereço já em uso - bind (2) (Errno :: EADDRINUSE)

Atualização de 2014:

Para concluir algumas das respostas abaixo: Após executar os comandos kill, a exclusão do arquivo pid pode ser necessária rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Uma solução muito elegante para matar um processo em QUALQUER porta especificada pelo usuário pode ser encontrada na resposta de @Kevin Suttle abaixo. Reproduzido aqui para posteridade:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584

4
A porta 3000 não é 'altamente específica para o desenvolvimento de trilhos' - o Meteor também roda nativamente em 3000, e tenho certeza de que há outras.
precisa saber é o seguinte

@ user456584 's comentário acima deve ser a resposta aceita ^^^ Essa função trabalhou para matar os muitos processos que eu tinha executado em uma porta
Aneuway

Respostas:


3027
  1. Podes tentar netstat

    netstat -vanp tcp | grep 3000
    
  2. Para o macOS El Capitan e mais recente (ou se o seu netstat não suportar -p), uselsof

    sudo lsof -i tcp:3000 
    
  3. Para o Centos 7, use

    netstat -vanp --tcp | grep 3000
    

22
Obrigado! Sua resposta deu origem ao meu script "death_to 'port'". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1 02/02

192
A bandeira "concisa" para lsof produz uma saída apropriada para tubulação para uma morte posterior:lsof -t -i tcp:1234 | xargs kill
Manav

6
Tenho colocar isso em meu ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillEntão agora eu só precisa digitar killport 8080e ele me salva alguns segundos
Alfonso Pérez

3
Outra dica: tente sudoantes do lsof se você não vê saída
Abe Petrillo

4
Outra dica é adicionar -Pao lsofcomando para que a porta bruta seja visível na saída:lsof -P -i:3000
Jason Axelson

1876

Encontrar:

sudo lsof -i :3000

Mate:

kill -9 <PID>

61
Às vezes, lsof -i: port não mostra nada. tente sudo lsof -i: port .
precisa saber é

31
Recomende a tentativa kill -15 <PID>antes de recorrer para -9a segurança.
Jamon Holmgren

7
@Jamon Holmgren, por que? o que os dois fazem? e por que kill <PID>não é suficiente / perigoso / incompleto?
Michael Trouw

13
@ MichaelTrouw quase um ano depois, mas aqui está sua resposta. :-) unix.stackexchange.com/a/8918 TL; DR kill -15oferece ao processo uma chance de limpar a si próprio.
Jamon Holmgren

9
Eu acho que essa resposta deve dizer o que -9faz.
Joseph Fraley

207

Nada acima funcionou para mim. Qualquer pessoa com minha experiência pode tentar o seguinte (funcionou para mim):

Corre:

lsof -i :3000 (where 3000 is your current port in use)

verifique o status do PID relatado:

ps ax | grep <PID>

finalmente, "vá com ele":

kill -QUIT <PID>

18
Na verdade, isso parece uma resposta melhor do que a dada muito mais tarde por Filip Spiridonov, que tem 277 votos contra o seu 9. O seu foi 6 meses antes e tem as mesmas informações com um pouco mais de explicação. Não há justiça ...
Floris

Tente kill -TERM(ou apenas kill) antes kill -QUIT. Nem todo processo fará um desligamento ordenado no SIGQUIT.
craig65535 21/01

160

Um one-liner para extrair o PID do processo usando a porta 3000 e matá-lo.

lsof -ti:3000 | xargs kill

O sinalizador -t remove tudo, exceto o PID, da saída lsof, facilitando sua eliminação.


13
Você pode filtrar as portas de "escuta" com:lsof -ti:3000 -sTCP:LISTEN
Zlemini

1
Este método funciona melhor para mim. Um forro simples que limpa a porta ocupada. Obrigado!
Ryan Trainor

139

Solução mais fácil :

Para porta única:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Mate várias portas com o comando de linha única:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID do processo / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Finaliza os processos 82499 e 82500 em um único comando.

Para usar isso em package.jsonscripts:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
Isso funcionou para mim Thanks :)
Dileep THOMAS

2
Ainda bem que ajudou.
Abhijith Sasikumar

113

É fácil lembrar dessa linha de comando:

npx kill-port 3000

Para uma ferramenta mais poderosa com a pesquisa:

npx fkill-cli


PS: Eles usam pacotes javascript de terceiros. npxvem embutido com Node.js.

Fontes: tweet | github


Você pode compartilhar detalhes sobre a instalação do npx usando o brew? Tentei instalá-lo no meu Mac High Sierra, 10.13.3 e não funcionou.
realPK

O @realPK npxvem com o npmque acompanha node.js, portanto não é um pacote separado. Basta atualizar seu node.js e suas versões do npm.
Bruno Lemos

Eu faço Java principalmente, ainda não me expus ao Node. Eu encontrei uma maneira diferente de matar o serviço em execução no porto. TY por responder.
RealPK 13/1018

5
A necessidade de NodeJS e JavaScript, para matar algo em execução na porta 3000 provavelmente trilhos ... parece muita sobrecarga para mim. adicionar uma linha simples ao seu .bashrc ou .zshrc com um alias resolveria isso sem a necessidade da Internet. alias kill3000 = 'lsof -ti: 3000 | xargs kill ', então você pode fazer: kill3000
Khalil Gharbaoui

Melhor solução para este problema .. obrigado
Rei Rayhan

107

Você pode usar lsof -i:3000.

Isso é "Listar arquivos abertos". Isso fornece uma lista dos processos e quais arquivos e portas eles usam.


Estou no lepard 10.5 (Q atualizado). Não sei se isso importa aqui, mas lsof não exibe portas. lsof -h (lsof 4,78) é muito críptica também me ...
oma

1
Hmm. Não sei ao certo o Leopard, mas tente ( como root - isso é importante, eu acho) lsof -i:3000.
Matt Gibson

59

No seu .bash_profile, crie um atalho para terminateo processo 3000:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Em seguida, ligue $terminatese estiver bloqueado.


12
Você pode tornar isso flexível o suficiente para qualquer porta: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle

E um nome tão descritivo = p
Michael Peterson

Eu tenho algo parecido com isso, mas passo no porto. Eu nomeei minha função KP como kill port.
Joseph Chambers

58

Para matar forçosamente um processo como esse, use o seguinte comando

lsof -n -i4TCP:3000 

Onde 3000 é o número da porta em que o processo está sendo executado

isso retorna a identificação do processo (PID) e executa

kill -9 "PID"

Substitua o PID pelo número obtido após executar o primeiro comando

Por exemplo, se eu quiser matar o processo em execução na porta 8080


38
lsof -P | grep ':3000' | awk '{print $2}'

Isso lhe dará o pid, testado no MacOS.


10
no MAC mata todos os pids na porta 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg

1
mais de um processo pode escutar a mesma porta?
Kris

Nossos rails app gera trabalhadores que são processos filhos, e eu tenho que usar isso para matar trabalhadores órfãs
mike Clagg

2
isto também mata webbrowsers conectam à porta
fjsj

5
Aqui está um trabalho:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

Execute na linha de comando no OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

A opção concisa de lsof retorna apenas o PID.


28

Uma das maneiras de eliminar um processo em uma porta é usar a biblioteca python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Uma vez instalado, basta:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
Essa, de longe, NÃO é a maneira mais simples. As respostas votadas não requerem que você baixe e instale nada.
Greg Pasquariello

4
Quando os pré-requisitos são atendidos, isso é simples e fácil de lembrar. Temos uma definição diferente de "mais simples" e essa resposta é perfeitamente válida e apropriada. Talvez esteja faltando apenas as instruções para instalar o freeport com o pip.
Cyril Duchon-Doris

sob o capô, o freeport é apenas um invólucro que chama lsof -t -i:3000.. parece desnecessário.
Corey Goldberg #

Esta solução não é o mais fácil, mas cumpre 100% com o que o OP perguntou ... Por isso, é de fato válida AF
danielrvt

26

Para visualizar os processos que estão bloqueando a porta:

netstat -vanp tcp | grep 3000

Para matar os processos que estão bloqueando a porta:

kill $(lsof -t -i :3000)


Isso não funcionará em uma máquina Mac, mas retornará o seguinte: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]No entanto, funcionará na maioria das distribuições Linux
Milan Velebit

1
@MilanVelebit Na verdade, ele funciona perfeitamente na minha máquina Mac (Sierra). Funciona bem se a sua porta 3000estiver ocupada. No entanto, se nenhum processo estiver bloqueando a porta, você receberá um kill: not enough argumentserro.
Henry

Isso é estranho, eu tenho dois Macs (ambos High Sierra tho), lembro de executar esses comandos em ambos (hábitos antigos) e sei com certeza que eles não são executados. Acabei de tentar novamente na minha máquina, sabendo que a porta está ocupada, o mesmo erro. : /
Milan Velebit

Você recebeu um PID válido em execução netstat -vanp tcp | grep 3000para a sua porta ocupada?
Henry

1
Eu tentei em ambos bashe zshshell. Funciona bem para mim. Não sei por que não está funcionando para você. Pode haver algo a ver com High Sierra? Eu não tenho nenhuma idéia: /
Henry

24

Encontre a conexão aberta

lsof -i -P | grep -i "escuta"

Eliminar por ID do processo

kill -9 'PID'


20

Encontre e mate:

Essa linha de comando única é fácil e funciona corretamente.

kill -9 $(lsof -ti tcp:3000)

14

Possíveis maneiras de conseguir isso:

topo

O comando top é a maneira tradicional de visualizar o uso de recursos do seu sistema e ver os processos que estão ocupando a maioria dos recursos do sistema. Top exibe uma lista de processos, com os que usam mais CPU na parte superior.

ps

O comando ps lista os processos em execução. O comando a seguir lista todos os processos em execução no seu sistema:

ps -A

Você também pode canalizar a saída através do grep para procurar um processo específico sem usar outros comandos. O comando a seguir procuraria o processo do Firefox:

ps -A | grep firefox

A maneira mais comum de transmitir sinais para um programa é com o comando kill.

kill PID_of_target_process

lsof

Lista de todos os arquivos abertos e os processos que os abriram.

lsof -i -P | grep -i "listen"
kill -9 PID

ou

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - listará o processo em execução nessa porta

kill -9 PID - matará o processo

no seu caso, será

lsof -i tcp:3000 do seu terminal encontre o PID do processo

kill -9 PID



5

Adicionar a ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Então source ~/.bash_profilee corra

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Se você estiver em uma situação em que existem clientes e servidores usando a porta, por exemplo:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

então você provavelmente não quer matar os dois.

Nesta situação, você pode usar -sTCP:LISTENpara mostrar apenas o pid dos processos que estão ouvindo. Combinando isso com o -tformato conciso, você pode eliminar automaticamente o processo:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

Eu fiz um pouco de função para isso, adicioná-lo ao seu arquivo rc ( .bashrc, .zshrcou qualquer outro)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

então você pode apenas digitar kill-by-port 3000 para matar seu servidor Rails (substituindo 3000 por qualquer porta em que esteja executando)

caso contrário, você sempre pode digitar kill -9 $(cat tmp/pids/server.pid)no diretório raiz do rails


Eu tive que fazer uma barra invertida \$PORTpara que a mensagem fosse exibida corretamente. Caso contrário, funciona muito bem!
Ashwood

4

Para matar várias portas.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Espero que esta ajuda!


1

Você deve tentar isso, esta técnica é independente do sistema operacional.

Além da sua aplicação, existe uma pasta chamada tmp, dentro dela existe outra pasta chamada pids. Esse arquivo contém o arquivo pid do servidor. Simplesmente exclua esse arquivo. porta se mata automaticamente.

Eu acho que esse é o caminho mais fácil.


1

Aqui está uma função auxiliar bash para matar vários processos por nome ou porta

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Uso:

$ fkill [process name] [process port]

Exemplo:

$ fkill someapp :8080 node :3333 :9000


0

Se você quer uma maneira livre de código - abra o gerenciador de atividades e force o kill kill :)



-1

Etapa 1: Encontre o servidor que está sendo executado: ps aux | grep puma Etapa 2: Mate os servidores Mate -9 [número do servidor]


-1

No Mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
Isso foi publicado como comentário há 5 anos e respostas simuladas foram publicadas várias vezes.
Gilles Gouaillardet
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.