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.