Encontrar (e matar) a porta de bloqueio do processo 3000 no Mac

Como faço para encontrar processos que escuta / usa minhas portas tcp? Eu estou no mac os x.

Às vezes, depois de um acidente ou algum bug, meu aplicativo rails está bloqueando a porta 3000. Não consigo encontrá-lo usando ps -ef … Como faço para encontrar a coisa estúpida e matá-lo, brutalmente …?

Ao fazer

rails server 

eu recebo

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

Atualização de 2014:

Para completar algumas das respostas abaixo: Depois de executar os comandos kill, excluir o arquivo pid pode ser necessário rm ~/mypath/myrailsapp/tmp/pids/server.pid

  1. Você pode tentar netstat

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

     sudo lsof -i tcp:3000 
  3. Para o uso do Centos 7

     netstat -vanp --tcp | grep 3000 

Encontrar:

 [sudo] lsof -i :3000 

Matar:

 kill -9  

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

Corre:

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

em seguida, verifique o status do PID informado:

 ps ax | grep  

finalmente, “begone with it”:

 kill -QUIT  

Você pode usar lsof -i:3000 .

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

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

 lsof -ti:3000 | xargs kill 

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

Em seu .bash_profile , crie um atalho para terminate o processo 3000:

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

Então, ligue para $terminate se estiver bloqueado.

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

 lsof -n -i4TCP:3000 

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

isso retorna o ID do processo (PID) e executa

 kill -9 "PID" 

Substitua o PID pelo número que você obteve após executar o primeiro comando

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

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

Isso lhe dará apenas o pid, testado no MacOS.

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, simplesmente:

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

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

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

A opção válida de lsof retorna apenas o PID.

Encontre a conexão aberta

lsof -i -P | grep -i “escuta”

Matar por ID do processo

kill -9 ‘PID’

Esta linha de comando única é fácil de lembrar:

npx kill-port 3000

Para uma ferramenta mais poderosa com pesquisa:

npx fkill-cli


PS: Eles usam pacotes javascript de terceiros

Fontes: tweet | github

Possíveis maneiras de conseguir isso:

topo

O comando top é a maneira tradicional de visualizar o uso de resources do sistema e ver os processos que estão ocupando mais resources do sistema. Top exibe uma lista de processos, com os que usam mais CPU no topo.

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 por um processo específico sem usar nenhum outro comando. O seguinte comando procuraria pelo processo do Firefox:

 ps -A | grep firefox 

A maneira mais comum de passar 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 

Adicione a ~/.bash_profile :

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

Então, source ~/.bash_profile e execute

killTcpListen 8080

Usando a ferramenta fkill do sindresorhus , você pode fazer isso:

 $ fkill :3000 

Eu fiz uma pequena function para isso, adicione-o ao seu arquivo rc ( .bashrc , .zshrc ou 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 simplesmente digitar kill-by-port 3000 para matar seu servidor rails (substituindo 3000 por qualquer porta que esteja sendo executada)

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

TL; DR:

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

Se você estiver em uma situação em que haja 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:LISTEN para mostrar apenas o pid de processos que estão escutando. Combinando isso com o formato -t terse você pode automaticamente matar o processo:

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

Você deve tentar isso, essa técnica é Independente do SO.

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

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

você pode usar o comando

 lsof -h 

uso deste comando para encontrar porta é

 -ii select by IPv[46] address: [46][proto][@host|addr][:svc_list|port_list] 

No seu caso, digite

 lsof -i :3000 

Encontre e mate:

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

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

Aqui está uma function bash auxiliar 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 

Se nada dos itens acima tentar:

 lsof -n -i4TCP:3000 

Você deve tentar este código usando o terminal:

 $ killall -9 ruby