Saltar al contenido

Matar el proceso que se ejecuta en el puerto 80

Posteriormente a investigar con expertos en el tema, programadores de varias ramas y profesores hemos dado con la respuesta al problema y la plasmamos en esta publicación.

Solución:

Hay varias formas de encontrar qué proceso en ejecución está utilizando un puerto.

Al usar fuser, proporcionará los PID de las múltiples instancias asociadas con el puerto de escucha.

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

Después de averiguarlo, puede detener o eliminar los procesos.

También puede encontrar los PID y más detalles usando lsof

sudo lsof -i tcp:80

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME  
nginx   1858     root    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1867 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1868 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1869 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1871 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  

Para limitar a enchufes que escucha en el puerto 80 (a diferencia de los clientes que se conectan al puerto 80):

sudo lsof -i tcp:80 -s tcp:listen

Para matarlos automáticamente:

sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill

Aquí hay un oneliner que muestra el comando para ejecutar:

echo kill $(sudo netstat -anp | awk '/ LISTEN / if($4 ~ ":80$")  gsub("/.*","",$7); print $7; exit  ')

Reemplazar echo por sudo para que el proceso realmente se elimine.

Se ofrecen tres opciones para listar puertos abiertos en jsh’s whatisonport:

netstat -anp --numeric-ports | grep ":$PORT>.*:" 

fuser -v "$PORT"/tcp

lsof -P -S 2 -i "tcp:$PORT" | grep "(:$PORT->.*:|:$PORT (LISTEN)$)"

yo prefiero netstat porque es rápido, conciso y puede enumerar los puertos abiertos por otros usuarios. (Aunque aún necesitará privilegios de superusuario/usuario para enumerar los nombres y PID de dichos procesos).

Salidas

$ netstat -anp --numeric-ports | grep ":80>.*:" 
tcp6       0      0 :::80           :::*            LISTEN      1914/apache2    

$ fuser -v "80/tcp"
                     USER        PID ACCESS COMMAND
80/tcp:              root       1914 F.... apache2
                     www-data  12418 F.... apache2
...

$ lsof -P -S 2 -i "tcp:80" | grep "(:80->.*:|:80 (LISTEN)$)"
apache2  1914     root    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
apache2 12418 www-data    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
...

El uso de grep en dos casos es hacer coincidir solo el puerto en el lado local y omitir las conexiones abiertas a un puerto remoto 80. (Una alternativa sería usar -l con netstato con lsof usar -sTCP:LISTENpero me gustan los greps anteriores porque también atraparán extrovertida conexiones desde el puerto dado, que ocasionalmente puede ser de interés.)

Con lsof usamos -P mostrar :80 en vez de :http para hacer posible el grep. Él -S 2 fuerzas de opción lsof para completar en tiempo y forma.

Matar el proceso

Suponiendo que queremos usar netstatpodríamos tomar los PID de esta manera:

$ netstat -anp --numeric-ports | grep ":80>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...

E incluso podríamos pasar esos PID a kill:

... | xargs -d 'n' kill -KILL

Sin embargo, a menudo hay un potencial para false positivo al usar expresiones regulares, por lo que recomendaría simplemente mirar la salida inicial de netstat y luego decidir manualmente si ejecutar o no:

$ kill -KILL 1914

Ver también

Tengo otro script llamado listopenports que puede ser de interés.

Comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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