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

oma
fonte
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
    
ghostdog74
fonte
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>
Filip Spiridonov
fonte
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>
Austin
fonte
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.

Zlemini
fonte
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" }

Abhijith Sasikumar
fonte
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

Bruno Lemos
fonte
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.

DerMike
fonte
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.

alexzg
fonte
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

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

Isso lhe dará o pid, testado no MacOS.

Kris
fonte
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.

JE42
fonte
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
YBathia
fonte
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)

Henry
fonte
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'

Sourabh Bhagat
fonte
20

Encontre e mate:

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

kill -9 $(lsof -ti tcp:3000)
Dylan Breugne
fonte
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 
suave
fonte
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

Shan
fonte
10

Esses dois comandos ajudarão você a encontrar e matar o processo do servidor

  1. lsof -wni tcp: 3000
  2. kill -9 pid
Saif chaudhry
fonte
Prazer, Aashiah
Saif chaudhry
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

rofrol
fonte
5

Usando sindresorhus é fkill ferramenta, você pode fazer isso:

$ fkill :3000
Kodie Grantham
fonte
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
Benjie
fonte
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

Caleb Keene
fonte
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!

Binh Ho
fonte
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.

Arun P
fonte
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
Miguel Mota
fonte
1

Você pode tentar isso

netstat -vanp tcp | grep 3000
Foram Thakral
fonte
0

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

HannahCarney
fonte
0

Eu uso isso:

cat tmp/pids/server.pid | pbcopy

Então kill -9 'paste'

Mihail hidr0 Kirilov
fonte
-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]

Thiện Nguyễn
fonte
-1

No Mac OS

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

Nada
fonte
1
Isso foi publicado como comentário há 5 anos e respostas simuladas foram publicadas várias vezes.
Gilles Gouaillardet