Tutoriales

Cómo cerrar un puerto abierto matando el proceso en Linux

Su servidor se niega a iniciarse porque ya hay algo en el puerto 8080. Debe encontrar lo que lo está ocupando y eliminarlo sin reiniciar toda la computadora.

Esta situación ocurre a menudo en el trabajo real de gestión del sistema. Reinicia el servicio, obtiene la dirección que se utilizó y ahora está investigando la lista de procesos tratando de encontrar qué está ocupando su puerto.

La solución es sencilla una vez que conoces los comandos correctos, y hay 3 formas fiables de hacerlo, dependiendo de las herramientas disponibles en tu sistema.

Primero encuentre lo que se está ejecutando en el puerto.

Antes de eliminar cualquier cosa, necesita saber qué proceso es el propietario del puerto. Adivinar y matar procesos aleatorios es cómo se rompen las cosas en la producción. Así que ejecuta uno de ellos primero.

lsof es la herramienta más utilizada y está disponible en casi todos los sistemas Linux de forma predeterminada.

sudo lsof -i :8080

este sudo El comando se ejecuta aquí con privilegios de root, por lo que lsof Puede ver procesos propiedad de otros usuarios, no solo los suyos. Sin él, sólo verá los procesos ejecutándose como el usuario actual, que generalmente no es lo que desea.

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node     3821    ravi   22u  IPv6  54312      0t0  TCP *:8080 (LISTEN)

Este resultado te lo dice todo. node es el nombre del proceso, 3821 es el PID que usaste para matarlo, y LISTEN Confirme que mantiene activamente el puerto abierto. si ves ESTABLISHED En cambio, el proceso tiene una conexión activa a través del puerto.

si lsof No instalado, utilice el comando ss, que es iproute2 paquete de software y está disponible en casi todos los sistemas Linux modernos.

sudo ss -tulnp | grep :8080

Esto es lo que hace cada bandera:

  • -t – Mostrar sockets TCP
  • -u – Mostrar sockets UDP
  • -l – Mostrar sólo tomas de escucha
  • -n – Mostrar el número de puerto en lugar del nombre del servicio
  • -p – Mostrar procesos usando sockets
tcp   LISTEN 0  128   0.0.0.0:8080   0.0.0.0:*   users:(("node",pid=3821,fd=22))

este pid=3821 Al final eso es lo que buscas. Mismo proceso, mismo PID, solo diferentes herramientas para encontrarlo.

Utilice el comando matar para matarlo.

una vez que tengas PIDel comando kill es el método directo. Por defecto envía SIGTERM (Señal 15), que requiere que el proceso cierre limpiamente y vacíe cualquier identificador o conexión de archivo abierto antes de salir.

kill 3821

Sin salida significa que funciona. correr lsof -i :8080 Confirma nuevamente.

lsof -i :8080

Si el proceso ignora SIGTERM Después de unos segundos el puerto sigue ocupado, fuercelo SIGKILL (Señal 9), finaliza el proceso inmediatamente sin darle oportunidad de limpiarse.

kill -9 3821

advertir: SIGKILL El proceso no puede detectarlo ni bloquearlo, por lo que funciona siempre, pero también significa que el proceso no tiene posibilidad de escribir los datos pendientes en el disco o cerrar limpiamente la conexión de la base de datos. Piense en ello como un último recurso, no como un primer paso.

Simplemente mátalo con el fusor.

La directiva sobre fusión omite por completo el enfoque de dos pasos. Le asigna un número de puerto y elimina todo lo que lo esté usando, no se requiere búsqueda PID.

sudo fuser -k 8080/tcp
  • -k – Envíe SIGTERM a todos los programas que utilicen este puerto.
  • 8080/tcp – Su puerto y protocolo de destino.
8080/tcp:  3821

fuser Imprimir PID Mata y sale. Eso es todo. si quieres señal de muerte en lugar de SIGTERMAñadir -9:

sudo fuser -k -9 8080/tcp

notas: fuser Es posible que no esté instalado de forma predeterminada en una instalación mínima de servidor, así que instálelo como se muestra.

sudo apt install psmisc         [On Debian, Ubuntu and Mint]
sudo dnf install psmisc         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]

si esto te salva de volverte loco ps aux | grep Reunión, Quien todavía viaja largas distancias.

Si desea obtener más información sobre la gestión de procesos y la arquitectura interna del sistema, Curso de aprendizaje de Linux de 7 días. Pro TecMint cubre todo, desde lo básico hasta escenarios prácticos de solución de problemas.

Usa lsof para matarlo todo de una vez y todos juntos

Si desea omitir la búsqueda PID manual y terminar con un solo comando, combine lsof y kill Reemplazar mediante comando.

sudo kill -9 $(sudo lsof -t -i :8080)

Esto es lo que hace cada parte:

  • lsof -t -i :8080 este -t El indicador solo genera el PID y nada más, por lo que obtienes un número limpio para pasar y matar.
  • $(...) – Sustitución de comandos, ejecutando comandos internos y pasando su salida como argumentos.
  • kill -9 – Enviar SIGKILL a cualquier PID devuelto por lsof.

Si el puerto vuelve vacío después de ejecutarse, el proceso desaparece y el puerto queda inactivo. si lo consigues kill: usage o error de sintaxis, el puerto ya está libre y lsof No se devuelve nada, por lo que Kill no tiene ningún efecto.

pista: Si varios procesos comparten el mismo puerto (raro, pero sucede en SO_REUSEPORT), esta línea mató a todos inmediatamente, porque lsof -t Se pueden volver a cargar varios PID en diferentes líneas.

¿Lo encuentras útil? que acaba de golpear su primero»La dirección ya está en uso.“Error, no sé por dónde empezar.

en conclusión

Ahora tienes 3 métodos de trabajo: lsof o ss Para identificar un PID, elimínelo con kill PID, fuser matar directamente a través del puerto, y lsof + kill Los comandos de una sola línea se pueden usar cuando desee lograrlo con un solo comando.

Una cosa que puedes probar ahora es: iniciar cualquier servicio en el puerto 8080 (python3 -m http.server 8080 Esto funciona si tienes Python instalado), luego ejecuta sudo lsof -i :8080toma el PID y elimínalo. Hágalo varias veces y la memoria muscular se adherirá más rápido que cualquier marcapáginas.

¿Cuál es el peor conflicto portuario que haya encontrado en producción? ¿Hay algo que está secuestrando el puerto de la base de datos o es un proceso zombie que no muere? ponlo en comentarios.

Si este artículo fue útil, Con alguien de tu equipo.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba