¿Cómo cierro un puerto abierto desde el terminal en la Mac?

197

Abrí el puerto # 5955 de una clase de Java para comunicarme desde un cliente. ¿Cómo cierro este puerto después de haber terminado? y también qué comando me puede mostrar si el puerto está abierto o cerrado?

usuario1667108
fuente
1
¿Cómo abriste ese puerto? No está claro si está hablando de abrir y cerrar los puertos en la aplicación Java o desde el firewall.
mariosangiorgio

Respuestas:

395
  1. Descubra el ID de proceso (PID) que ocupa el número de puerto (por ejemplo, 5955) que desea liberar

    sudo lsof -i :5955
    
  2. Elimine el proceso que actualmente utiliza el puerto utilizando su PID

    sudo kill -9 PID
    
Futuro2020
fuente
32
Enviar -9 no debería ser el primer intento de matar un proceso, y es un mal hábito. Como recuerdo, primero debes usar kill PID(lo que implica -15), luego probar -2 y -1. -9 es el último recurso sólo si cada otras opciones no funcionó.
Miau
3
mató pID sin ninguna bandera como lo sugirió @Meow y esto funcionó para mí
Toni Leigh
39

Para encontrar el proceso, intente:

sudo lsof -i :portNumber

Elimine el proceso que actualmente utiliza el puerto utilizando su PID

kill PID

y luego verifique si el puerto se cerró. Si no, intente:

kill -9 PID

Solo haría lo siguiente si el anterior no funcionara

sudo kill -9 PID

Solo para estar seguros. De nuevo, dependiendo de cómo abrió el puerto, esto puede no importar.

oeste
fuente
25

Sin embargo, abrió el puerto, lo cierra de la misma manera. Por ejemplo, si creó un socket, lo vinculó al puerto 0.0.0.0:5955 y llamó a listen, cierre ese mismo socket.

También puede simplemente matar el proceso que tiene el puerto abierto.

Si desea averiguar qué proceso tiene un puerto abierto, intente esto:

lsof -i :5955

Si desea saber si un puerto está abierto, puede hacer el mismo comando lsof (si algún proceso lo tiene abierto, está abierto; de lo contrario, no lo está), o puede intentar conectarse a él, por ejemplo:

nc localhost 5955

Si vuelve inmediatamente sin salida, el puerto no está abierto.

Vale la pena mencionar que, técnicamente hablando, no es un puerto abierto, sino una combinación host: puerto. Por ejemplo, si está conectado a una LAN como 10.0.1.2, podría vincular un socket a 127.0.0.1:5955 o 10.0.1.2:5955, sin que ninguno afecte al otro, o podría vincular a 0.0.0.0 : 5955 para manejar ambos a la vez. Puede ver todas las direcciones IPv4 e IPv6 de su computadora con el ifconfigcomando.

abarnert
fuente
24

muy simple encontrar el puerto 5900:

sudo lsof -i :5900

luego considerando 59553 como PID

sudo kill 59553
flik
fuente
1
¡Esto no agrega nada a las respuestas existentes!
hatef
16

En 2018, esto es lo que funcionó para mí usando MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

luego:

sudo kill -9 yourPIDnumber

Gel
fuente
1
lsof -nPies un poco mejor porque el número de puerto es realmente visible en la salida y tienes una mejor idea de lo que estás matando.
Rich Stone
1
También es útil para ver la información de todos los puertos de escucha:sudo lsof -nPi | grep LISTEN
leanne
14

Un trazador de líneas es el mejor

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

Ejemplo: en Mac, quería borrar el puerto 9604. El siguiente comando funcionó de maravilla

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

También puede usar este primer comando para matar un proceso que posee un puerto en particular:

sudo netstat -ap | grep :<port_number>

Por ejemplo, supongamos que este proceso contiene el puerto 8000 TCP y luego ejecuta el comando:

sudo netstat -ap | grep :8000

mostrará la línea correspondiente al proceso que contiene el puerto 8000 , por ejemplo:

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

En este caso, procHoldingPort es el nombre del proceso que abrió el puerto, 4683 es su pid y 8000 (tenga en cuenta que es TCP) es el número de puerto que contiene (que desea cerrar).

Luego elimine el proceso, siguiendo el ejemplo anterior:

kill  4683

Como otros mencionaron aquí, si eso no funciona (puede intentar usar kill con -9 como argumento):

kill -9 4683

Nuevamente, en general, es mejor evitar enviar SIGKILL (-9) si puedes.

Salud,

Chico.

Guy Avraham
fuente
5

Yo uso lsofcombinado con kill, como se mencionó anteriormente; pero escribió un pequeño script bash rápido para automatizar este proceso.

Con este script, simplemente puede escribir killport 3000desde cualquier lugar y eliminará todos los procesos que se ejecutan en el puerto 3000.

https://github.com/xtrasimplicity/killport

XtraSimplicity
fuente
1
Salvaste mi día. Por alguna razón, lsofen combinación con killno devolvió nada e hizo que mi script se bloqueara en macOS Sierra. Pero killportfunciona de maravilla y es más rápido. ¡Gracias!
Wout
4

He creado una función para este propósito.

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 y pegar este bloque de código en su terminal debería liberar su puerto deseado. Solo recuerde cambiar el número de puerto en la última línea.

Md. Khairul Islam
fuente
3

intente a continuación, suponiendo que el puerto en ejecución es 8000:

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

Encontré la referencia aquí

Hasan A Yousef
fuente
1

Cuando el programa que abrió el puerto se cierra, el puerto se cerrará automáticamente. Si elimina el proceso Java que ejecuta este servidor, eso debería hacerlo.

Barmar
fuente
-1
  1. Primero descubra la identificación de Procees (pid) que ha ocupado el puerto requerido (por ejemplo, 5434)

    ps aux | grep 5434

2. matar ese proceso

   kill -9 <pid>
Ashutosh Gupta
fuente