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 netstat
o con lsof
usar -sTCP:LISTEN
pero 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 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 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.