Como fecho uma porta aberta do terminal no Mac?

197

Abri a porta # 5955 de uma classe java para me comunicar com um cliente. Como fecho esta porta depois de terminar? e também qual comando pode me mostrar se a porta está aberta ou fechada?

user1667108
fonte
1
Como você abriu essa porta? Não está claro se você está falando sobre abrir e fechar as portas no aplicativo java ou no firewall.
Mariosangiorgio

Respostas:

395
  1. Descubra o ID do processo (PID) que está ocupando o número da porta (por exemplo, 5955) que você gostaria de liberar

    sudo lsof -i :5955
    
  2. Mate o processo que está atualmente usando a porta usando seu PID

    sudo kill -9 PID
    
Future2020
fonte
32
Enviar -9 não deve ser a primeira tentativa de matar um processo, e é um péssimo hábito. Pelo que me lembro, você deve primeiro usar kill PID(o que implica -15), depois tentar -2 e -1. -9 é o último recurso somente se todas as outras opções falharem no trabalho.
Miau
3
fez kill PID sem quaisquer bandeiras como sugerido por @Meow e isso funcionou para mim
Toni Leigh
39

Para encontrar o processo, tente:

sudo lsof -i :portNumber

Mate o processo que está atualmente usando a porta usando seu PID

kill PID

e verifique se a porta foi fechada. Caso contrário, tente:

kill -9 PID

Eu só faria o seguinte se o anterior não funcionasse

sudo kill -9 PID

Apenas para estar seguro. Novamente, dependendo de como você abriu a porta, isso pode não importar.

oeste
fonte
25

No entanto, você abriu a porta e fechou-a da mesma maneira. Por exemplo, se você criou um soquete, vincule-o à porta 0.0.0.0:5955 e chame listen, feche o mesmo soquete.

Você também pode simplesmente matar o processo que tem a porta aberta.

Se você deseja descobrir qual processo tem uma porta aberta, tente o seguinte:

lsof -i :5955

Se você quiser saber se uma porta está aberta, você pode executar o mesmo comando lsof (se houver algum processo aberto, aberto; caso contrário, não está), ou apenas tentar se conectar a ela, por exemplo:

nc localhost 5955

Se retornar imediatamente sem saída, a porta não estará aberta.

Vale a pena mencionar que, tecnicamente falando, não é uma porta aberta, mas uma combinação host: porta. Por exemplo, se você estiver conectado a uma LAN como 10.0.1.2, poderá vincular um soquete a 127.0.0.1:5955 ou 10.0.1.2:5955, sem que um deles afete o outro, ou vincular a 0.0.0.0 : 5955 para lidar com os dois de uma vez. Você pode ver todos os endereços IPv4 e IPv6 do seu computador com o ifconfigcomando

abarnert
fonte
24

muito simples encontrar a porta 5900:

sudo lsof -i :5900

considerando 59553 como PID

sudo kill 59553
flik
fonte
1
Isso não adiciona nada às respostas existentes!
Hatef # 12/18
16

Em 2018, aqui está o que funcionou para mim usando o MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

então:

sudo kill -9 yourPIDnumber

Gel
fonte
1
lsof -nPié um pouco melhor porque o número da porta é realmente visível na saída e você tem uma ideia melhor do que está matando.
Rich Stone
1
Também é útil apenas para ver as informações de todas as portas de escuta:sudo lsof -nPi | grep LISTEN
leanne
14

Um forro é o melhor

kill -9 $(lsof -i:PORT -t) 2> /dev/null

Exemplo: No mac, queria limpar a porta 9604. O comando a seguir funcionou como um encanto

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 
Amitesh
fonte
6

Você também pode usar este primeiro comando para eliminar um processo que possui uma porta específica:

sudo netstat -ap | grep :<port_number>

Por exemplo, digamos que esse processo contenha a porta 8000 TCP e execute o comando:

sudo netstat -ap | grep :8000

produzirá a linha correspondente ao processo que contém a porta 8000 , por exemplo:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

Nesse caso, procHoldingPort é o nome do processo que abriu a porta, 4683 é seu pid e 8000 (observe que é TCP) é o número da porta que ele mantém (que você deseja fechar).

Em seguida, mate o processo, seguindo o exemplo acima:

kill  4683

Como outros mencionados aqui, se isso não funcionar (você pode tentar usar kill com -9 como argumento):

kill -9 4683

Novamente, em geral, é melhor evitar o envio de SIGKILL (-9), se puder.

Felicidades,

Cara.

Guy Avraham
fonte
5

Eu uso lsofcombinado com kill, como mencionado acima; mas escreveu um pequeno script bash rápido para automatizar esse processo.

Com este script, você pode simplesmente digitar killport 3000de qualquer lugar, e isso matará todos os processos em execução na porta 3000.

https://github.com/xtrasimplicity/killport

XtraSimplicity
fonte
1
Você salvou meu dia. Por alguma razão, lsofem combinação com killnão retornou nada e fez meu script travar no macOS Sierra. Mas killportfunciona como um encanto e é mais rápido. Obrigado!
wout 11/09/16
4

Eu criei uma função para esse fim.

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

Copiar e colar este bloco de código no seu terminal deve liberar a porta desejada. Lembre-se de alterar o número da porta na última linha.

Md. Khairul Islam
fonte
3

tente abaixo, assumindo que a porta em execução seja 8000:

free-port() { kill "$(lsof -t -i :8000)"; }

Eu encontrei a referência aqui

Hasan A Yousef
fonte
1

Quando o programa que abriu a porta sair, a porta será fechada automaticamente. Se você matar o processo Java executando este servidor, isso deve ser feito.

Barmar
fonte
-1
  1. Primeiro, encontre a identificação do Procees (pid) que ocupou a porta necessária (por exemplo, 5434)

    ps aux | grep 5434

2. matar esse processo

   kill -9 <pid>
Ashutosh Gupta
fonte