Como faço para encontrar processos que escuta/usa minhas portas tcp? Eu 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 ps -ef ... Como encontro a coisa estúpida e a mato 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
Você pode tentar netstat
netstat -vanp tcp | grep 3000
Para macOS El Capitan e mais recente (ou se o seu netstat não suporta -p
), use lsof
Sudo lsof -i tcp:3000
Para Centos 7 use
netstat -vanp --tcp | grep 3000
Encontrar:
[Sudo] lsof -i :3000
Mate:
kill -9 <PID>
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 <PID>
finalmente, "begone with it":
kill -QUIT <PID>
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.
Você pode usar lsof -i:3000
.
Isso é "List Open Files". Isso fornece uma lista dos processos e quais arquivos e portas eles usam.
Em seu .bash_profile
, crie um atalho para terminate
o processo 3000:
terminate(){
lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
}
Em seguida, chame $terminate
se estiver bloqueado.
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
Para ver os processos bloqueando a porta:
netstat -vanp tcp | grep 3000
Para matar os processos que bloqueiam a porta:
kill $(lsof -t -i :3000)
Encontre a conexão aberta
lsof -i -P | grep -i "escuta"
Matar por ID do processo
kill -9 'PID'
Encontre o PID e mate o processo.
lsof -ti:3000 | xargs kill
Possíveis maneiras de conseguir isso:
topo
O comando principal é a maneira tradicional de visualizar o uso de recursos do sistema e ver os processos que estão ocupando mais recursos 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
Encontre e mate:
Esta única linha de comando é fácil e funciona corretamente.
kill -9 $(lsof -ti tcp:3000)
Solução mais fácil : Mate várias portas com o comando de linha única.
kill $(lsof -t -i:3000,3001) // 3000 and 3001 are the ports to be freed
lsof -t -i: 3000
82500
lsof-t -i: 3001
82499
lsof -t -i: 3001,3000
82499 82500
mata $ (lsof -t -i: 3001,3000)
Encerra os processos 82499 e 82500 no comando único.
lsof -t -i: 3000
lsof-t -i: 3001
Você pode usar isso em scripts package.json
"scripts": { "start": "kill $(lsof -t -i:3000,3001) && npm start" }
Usando sindresorhus 's fkill tool, você pode fazer isso:
$ fkill :3000
Adicione a ~/.bash_profile
:
function killTcpListen () {
kill -QUIT $(Sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}
Então source ~/.bash_profile
e corra
killTcpListen 8080
Eu fiz uma pequena função para isso, adicione-o ao seu arquivo rc (.bashrc
, .zshrc
ou o que for)
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ê poderia sempre digitar kill -9 $(cat tmp/pids/server.pid)
do 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
lsof -i tcp:port_number
- listará o processo em execução nessa porta
kill -9 PID
- irá matar o processo
no seu caso, será
lsof -i tcp:3000
do seu terminal encontre o PID do processo
kill -9 PID
Aqui está uma função bash auxiliar para matar vários processos por nome ou porta
fkill() {
for i in [email protected];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 [email protected] sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}
Uso:
$ fkill [process name] [process port]
Exemplo:
$ fkill someapp :8080 node :3333 :9000
Você deve tentar isso, essa técnica é independente do sistema operacional.
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. Basta excluir esse arquivo. porta automaticamente se mata.
Eu acho que esse é o caminho mais fácil.
Você pode tentar isso
netstat -vanp tcp | grep 3000
Se você quiser uma maneira livre de código - abra o gerenciador de atividades e force o nó de eliminação :)
Use o seguinte comando para eliminar o processo na porta 3000 kill $(lsof -t -i:3000)