Cómo matar un proceso de Linux por número de puerto
Para eliminar un proceso de Linux, necesita su ID o nombre. Si todo lo que sabe es el puerto que está usando, ¿puede matarlo? Sí, de varias maneras diferentes.
Procesos de matanza
A veces, un proceso de Linux puede dejar de responder. Puede dejar de funcionar correctamente o continuar funcionando pero ignorar las solicitudes para apagarlo o comenzar a consumir memoria, CPU o ancho de banda de 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 de eliminación con la identificación del proceso que desea eliminar. El kill
equipo tiene varios parientes cercanos. El comando pkill
eliminará el proceso por nombre y killall
eliminará cualquier proceso que pueda encontrar que comparta parte del nombre.
Si todo lo que sabe acerca de 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 conecta un cable con un enchufe en el extremo, como un cable de red CAT5 o 6 , o puede significar un puerto de software.
El puerto de software es la parte final de la conexión de red. La dirección IP del dispositivo identifica una computadora u otro dispositivo de red. Las aplicaciones dentro de una computadora usan diferentes puertos. Proporcionan un nivel diferente de detalle. El tráfico de red llegó a la computadora correcta usando una dirección IP y, con el direccionamiento de puertos, se puede enviar a la aplicación correcta.
Esto es similar a cómo llega el correo postal a un hotel, luego se clasifica y se entrega en las habitaciones correspondientes. Una dirección IP es como la dirección de una calle de hotel y los números de habitación son como números de puerto.
Si ve actividad de red en un puerto y no reconoce el proceso que lo está creando, o si su comportamiento está causando problemas o sospechas, es posible que desee eliminar ese proceso. Incluso si todo lo que sabe es el número de puerto, puede rastrear el proceso y eliminarlo.
Haciendo conexiones con socat
Para que podamos tener múltiples conexiones para matar, usaremos socat
para crear conexiones de red usando diferentes protocolos. Necesitarás 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 socat
es simple, aunque un poco detallada. Necesitamos especificar las direcciones de origen y destino. Para cada uno de ellos, debemos especificar el protocolo, la dirección IP y el número de puerto. Podemos reemplazar STDIN o STDOUT como fuente o destino.
Este comando crea una conexión entre un socket de escucha TCP en el puerto 7889, una dirección IP de loopback de 127.0.0.1 y STDOUT. El signo » &
» ejecuta el comando en segundo plano, por lo 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 que tengamos una pequeña selección de sockets usando 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 &
uso de asesinato
Por supuesto, podemos usar kill
para terminar un proceso si conocemos la identificación del proceso. Para encontrar el PID podemos usar lsof
el comando.
Para enumerar los detalles del proceso en el puerto 7889, que usa el protocolo TCP, usamos la -i
opción (dirección de Internet), como se muestra aquí.
lsof -i tcp:7889
El PID de este proceso es 3141 y podemos usarlo con kill
:
sudo kill 3141
Podemos ahorrar algo de esfuerzo si usamos tuberías. Si dirigimos la salida lsof
a un awk
comando awk
para buscar líneas que contengan el puerto que nos interesa, 7889, e imprimimos el segundo campo de esta línea, aislamos el PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
Luego podemos canalizar la salida awk
al kill
comando usando xargs
. Un comando xargs
toma la entrada a través de una canalización y la pasa a otro comando como parámetros de línea de comandos. Usaremos xargs
con kill
el equipo.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
No recibimos ningún comentario visual. Al estilo típico de Linux, ninguna noticia es una buena noticia. Si desea asegurarse de que el proceso se completó, puede lsof
volver a utilizarlo.
lsof -i tcp:7889
Como 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 un ss
comando para hacer esto. Usamos la -S
opción (SCTP) para buscar sockets SCTP, la -a
opción (all) para buscar todos los tipos de sockets (escuchando, recibiendo, conectados, etc.) y la -p
opción (processes) para listar información sobre el proceso usando el enchufe.
ss -Sap
Podemos analizar esta salida usando grep
y awk
. También podríamos analizarlo con grep
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 lo convertiría en un alias o una función de shell.
Enviaremos la salida de ss
a grep
y buscaremos nuestro número de puerto, 7889. Enviaremos la salida de grep
a awk
. En awk
, usamos -F
la opción (separator string) para establecer una coma » ,
» como separador de campo. Buscamos una línea que contenga «pid=» e imprimimos el segundo campo delimitado por comas de esa línea.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}'
Esto nos dio la cadena «pid=2859».
Podemos pasar eso awk
nuevamente, establecer el separador de campo en el signo igual » =
» e imprimir el segundo campo de esa línea, 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. Podemos usar xargs
para pasar el PID como kill
un parámetro de línea de comando.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
Esto elimina el proceso que estaba usando el socket del protocolo SCTP en el puerto 7889.
Equipo fusor
El comando fuser
simplifica enormemente el trabajo. La desventaja es que solo funciona con sockets TCP y UDP. En el lado positivo, estos son los dos tipos de enchufes más comunes con los que tendrá que lidiar. El comando fuser
ya se instaló en las máquinas Ubuntu, Fedora y Manjaro que probamos.
Todo lo que tiene que hacer es usar la -k
opción (matar) y especificar el puerto y el protocolo. Puede usar -n
la opción (espacio de nombres) y especificar el protocolo y el puerto, o usar el «formato de etiqueta de barra inclinada» y especificar primero el número de puerto.
fuser -n tcp 7889
fuser 7889/udp
El número de puerto, el protocolo y el PID del proceso completado se imprimen en la ventana del terminal.
Prueba el fusor primero
Lo más probable es que esté instalado en la computadora en la que está trabajando, y el protocolo probablemente sea TCP o UDP, por lo que es muy probable que la forma más fácil funcione para usted.
Deja una respuesta