Cómo eliminar un proceso de Linux por número de puerto

Para eliminar un proceso de Linux, necesita su ID o su nombre. Si todo lo que sabe es el puerto que está usando, ¿aún puede matarlo? Sí, de varias maneras diferentes.
Procesos de matanza
Ocasionalmente, un proceso de Linux puede dejar de responder. Puede dejar de funcionar correctamente, o puede seguir funcionando pero ignorar las solicitudes de apagado o comenzar a consumir memoria, CPU o ancho de banda de la red.
Sean cuales sean sus motivos, hay formas de eliminar un proceso desde la línea de comandos de Linux. El método clásico es usar el comando kill con la ID del proceso que desea terminar. los kill
comando tiene algunos parientes cercanos. los pkill
comando matará un proceso por nombre, y killall
matará todos los procesos que pueda encontrar que compartan parte de un nombre.
Si todo lo que sabe sobre un proceso es que está usando un puerto en su computadora, todavía hay formas de identificarlo y eliminarlo. En términos de red, "puerto" puede significar una conexión física en la que inserta un cable con un enchufe en el extremo, como un cable de red CAT5 o 6, o puede significar un puerto de software.
Un puerto de software es la parte final de una conexión de red. La dirección IP de un dispositivo identifica la computadora u otro dispositivo de red. Las aplicaciones dentro de la computadora usan diferentes puertos. Estos proporcionan otro nivel de granularidad. El tráfico de la red ha llegado a la computadora correcta utilizando la dirección IP y, al usar el direccionamiento de puerto, puede enviarse a la aplicación correcta.
Es como el correo postal que llega a un hotel, luego se clasifica y se entrega en las habitaciones correspondientes. La dirección IP es como la dirección de la calle del hotel y los números de habitación son como los números de puerto.
Si ve actividad de red en un puerto y no reconoce el proceso que la genera, o si su comportamiento es problemático o sospechoso, es posible que desee eliminar el proceso. Incluso si todo lo que sabe es el número de puerto, puede rastrear el proceso y eliminarlo.
Creando conexiones con socat
Para que tengamos algunas conexiones para matar, usaremos socat
para crear conexiones de red usando diferentes protocolos. Tendrás que instalar socat
. Para instalarlo en Ubuntu, use este comando:
sudo apt install socat
Sobre el uso de Fedora dnf
:
sudo dnf install socat
En Manjaro necesitas escribir:
sudo pacman -S socat
La sintaxis para socat
es sencillo aunque un poco prolijo. Necesitamos proporcionar las direcciones de origen y destino. Para cada uno de estos, debemos proporcionar el protocolo, la dirección IP y el número de puerto. Podemos sustituir STDIN o STDOUT como fuente o destino.
Este comando crea una conexión entre un socket de escucha TCP en el puerto 7889, en la dirección IP de loopback de 127.0.0.1 y STDOUT. El signo "&
"Ejecuta el comando en segundo plano, de modo que conservamos el acceso a la línea de comandos.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
Crearemos dos conexiones más para tener una pequeña selección de sockets que usen diferentes protocolos. Crearemos una conexión UDP y una conexión SCTP. La única parte del comando que cambia es el protocolo.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
RELACIONADO: ¿Cuál es la diferencia entre TCP y UDP?
usando matar
Por supuesto, podemos usar kill
para terminar el proceso, siempre y cuando sepamos cuál es la ID del proceso. Para encontrar el PID, podemos usar el lsof
dominio.
Para listar los detalles del proceso en el puerto 7889 que usan el protocolo TCP, usamos el -i
(dirección de Internet), así.
lsof -i tcp:7889
El PID de este proceso es 3141, y podemos seguir adelante y usarlo con kill
:
sudo kill 3141
Podemos ahorrarnos un poco de esfuerzo si usamos tuberías. Si canalizamos la salida de lsof
dentro awk
y decir awk
para buscar líneas que contengan el puerto que nos interesa, 7889, e imprimir el segundo campo de esa línea, aislaremos el PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
Entonces podemos canalizar la salida de awk
en el kill
comando usando xargs
. los xargs
El comando toma su entrada canalizada y la pasa a otro comando como parámetros de línea de comando. usaremos xargs
con el kill
dominio.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
No recibimos ningún comentario visual. En la forma típica de Linux, ninguna noticia es una buena noticia. Si desea verificar que el proceso ha finalizado, puede usar lsof
una vez más.
lsof -i tcp:7889
Porque lsof
no informa nada, sabemos que no existe tal conexión.
Podemos eliminar un proceso usando el protocolo UDP simplemente reemplazando "tcp" con "udp" en nuestro comando anterior.
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
Sin embargo, lsof
no reconoce el protocolo SCTP.
lsof -i sctp:7889
Podemos usar el ss
comando para hacer eso. estamos usando el -S
(SCTP) para buscar sockets SCTP, la -a
(todos) para buscar todos los tipos de enchufes (escuchando, aceptando, conectados, etc.), y el -p
(procesos) opción para listar los detalles del proceso usando el socket.
ss -Sap
Podemos analizar esa salida usando grep
y awk
. También podríamos analizarlo usando grep
y algunas expresiones regulares de PERL, pero de esta manera es mucho más fácil de entender. Si fuera a usar esto más de una o dos veces, probablemente haría un alias o una función de shell.
Canalizaremos la salida de ss
dentro grep
y busque nuestro número de puerto, 7889. Canalizaremos la salida de grep
dentro awk
. En awk
estamos usando el -F
(cadena de separación) opción para establecer una coma ",
"Como el delimitador de campo. Buscamos una cadena que contiene “Pid =" e imprima el segundo campo delimitado por comas de esa cadena.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'
Eso nos ha dado la cadena "pid = 2859".
Podemos canalizar eso en awk
de nuevo, establezca el delimitador de campo en el signo igual "=
”E imprima el segundo campo de que cadena, que será el texto detrás del signo igual.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
Ahora hemos aislado el ID del proceso. Nosotros podemos usar xargs
para pasar el PID a kill
como un parámetro de línea de comando.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
Eso mata el proceso que estaba usando el socket del protocolo SCTP en el puerto 7889.
El comando del fusor
los fuser
comando simplifica mucho las cosas. La desventaja es que solo funciona con sockets TCP y UDP. En el lado positivo, esos son los dos tipos más comunes de enchufes con los que tendrás que lidiar. los fuser
El comando ya estaba instalado en las computadoras Ubuntu, Fedora y Manjaro que verificamos.
Todo lo que necesita hacer es usar el -k
(matar) y proporcione el puerto y el protocolo. Puedes usar el -n
(espacio de nombres) y proporcione el protocolo y el puerto, o use el "formato de acceso directo de barra diagonal" y coloque el número de puerto primero.
fuser -n tcp 7889
fuser 7889/udp
El número de puerto, el protocolo y el PID del proceso finalizado se imprimen en la ventana del terminal.
Pruebe el fusor primero
Probablemente estará instalado en la computadora en la que está trabajando, y es probable que el protocolo sea TCP o UDP, por lo que existe una gran posibilidad de que la forma más simple funcione para usted.