Determinar el proceso pid que escucha en un puerto determinado

101

Como dice el título, estoy corriendo múltiples servidores de juego, y cada uno de ellos tiene el mismo namepero diferente PIDy el portnúmero. Me gustaría hacer coincidir el PIDdel servidor que está escuchando en cierto puerto, y luego me gustaría matar este proceso. Lo necesito para completar mi script bash.

¿Es eso siquiera posible? Porque todavía no encontró ninguna solución en la web.

Ciclón
fuente

Respuestas:

125

La -pbandera de netstatle da PID del proceso:

netstat -l -p

Editar: el comando que se necesita para obtener los PID de los usuarios de socket en FreeBSD es sockstat. Como trabajamos durante la discusión con @Cyclone, la línea que hace el trabajo es:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
stanwise
fuente
2
netstat: 80: unknown or uninstrumented protocolusó el 80puerto (nginx) para probar propósitos. No funcionó.
Ciclón
5
intente en su netstat -nlp | grep :80lugar
Stanwise
12
netstat: option requires an argument -- p
Ciclón
2
@jasonbrittain En Cygwin, netstatse llama al nativo de Windows . Tiene otra sintaxis.
stanwise
2
esta respuesta es incorrecta: netstat: la opción requiere un argumento - p
Buena persona
143

Versión corta que puede pasar al comando kill:

lsof -i:80 -t
Laurynas
fuente
13
Esto también incluye los procesos que están conectados en ese puerto. lsof -i4TCP:80 -sTCP:LISTEN -tes probablemente lo que quieres.
Nevir
Exactamente lo que estaba buscando. Quería matar un proceso buscando el puerto en el que se está ejecutando.
mythicalcoder
@Nevir ¿qué quieres decir con "también incluye procesos que están conectados en ese puerto"? ¿Puede usted explicar por favor?
kishorer747
2
kill -9 `lsof -i:80 -t`para facilitar la copia
bmjrowe
17

netstat -p -l | grep $PORTy las lsof -i :$PORT soluciones son buenas, pero prefiero la fuser $PORT/tcpsintaxis de extensión a POSIX (que funciona para coreutils) como con la tubería:

pid=`fuser $PORT/tcp`

imprime pid puro para que puedas dejar la sedmagia.

Una cosa que hace que fusermis herramientas favoritas es la capacidad de enviar señales a ese proceso directamente (esta sintaxis también es una extensión de POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

También -k es compatible con FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser

Gavenkoa
fuente
1
fusor us más limpio y conciso
Dawoodjee
10

netstat -nlp debería decirle el PID de lo que está escuchando en qué puerto.


fuente
1
netstat: 80: unknown or uninstrumented protocolusó el 80puerto (nginx) para probar propósitos. No funcionó.
Ciclón
3

Como sockstat no se instaló de forma nativa en mi máquina, pirateé la respuesta de stanwise para usar netstat en su lugar.

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""
dafky2000
fuente
3

Quería programar , usando solo Bash, matar el proceso de escucha en un puerto determinado.

Digamos que el puerto es 8089, entonces así es como lo hice:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

¡Espero que esto ayude a alguien más! Sé que ayudará a mi equipo.

Glavin001
fuente
1
Aquí está la función que utilizo para hacerlo: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Usando su ejemplo del puerto 8089:kill-listener 8089
Huracán Hamilton
3

Sintaxis:

kill -9 $ (lsof -t -i: número de puerto)

Ejemplo: para detener el proceso que se ejecuta en el puerto 4200, ejecute el siguiente comando

kill -9 $(lsof -t -i:4200)

Probado en Ubuntu.

Debashish Sen
fuente
2

en Windows, la opción netstat para obtener el pid es -o y -p selecciona un filtro de protocolo, por ejemplo: netstat -a -p tcp -o

Jan Wilmans
fuente