GNU/Linux >> Tutoriales Linux >  >> Linux

Matar el proceso que se ejecuta en el puerto 80

Hay varias formas de encontrar qué proceso en ejecución está usando 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 sockets que escuchan 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 whatisonport de jsh :

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

fuser -v "${PORT}"/tcp

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

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 netstat , o con lsof usar -sTCP:LISTEN , pero me gustan los greps anteriores porque también captarán saliente conexiones desde el puerto dado, que ocasionalmente puede ser de interés).

Con lsof usamos -P para mostrar :80 en lugar de :http para hacer posible el grep. El -S 2 opción fuerza lsof para completar de manera oportuna.

Matar el proceso

Asumiendo que queremos usar netstat , podrí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 existe la posibilidad de falsos positivos cuando se usan 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

Véase también

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


Linux
  1. ¿Cambiar el entorno de un proceso en ejecución?

  2. Descendientes del proceso?

  3. Cómo matar procesos en ejecución en Linux

  4. ¿Cómo eliminar un proceso que se ejecuta en un puerto específico en Linux?

  5. Ejemplos de comandos kill en Linux

Cómo matar un proceso en Linux

Comando matar en Linux

Cómo encontrar y matar procesos en ejecución en Linux

Cómo matar el proceso de ejecución de Linux en un puerto particular

Cómo MATAR un proceso en Linux

Procesos corriendo