Pregunta Determine el proceso pid escuchando en un puerto determinado


Como dice el título, estoy ejecutando múltiples servidores de juegos, y cada uno de ellos tiene el mismo name pero diferente PID y el port número. Me gustaría hacer coincidir el PID del servidor que está escuchando en cierto puerto, y luego me gustaría matar a este proceso. Lo necesito para completar mi script bash.

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


73
2018-03-24 23:26


origen


Respuestas:


los -p Bandera de netstat le da un PID del proceso:

netstat -l -p

Editar: El comando que se necesita para obtener los PID de 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

100
2018-03-24 23:30



Versión corta que puede pasar para matar el comando:

lsof -i:80 -t

116
2017-12-29 13:25



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

pid=`fuser $PORT/tcp`

imprime pid puro para que pueda soltar sed magia fuera.

Una cosa que hace fuser my lover tools es la capacidad de enviar señal 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


11
2018-01-31 14:35



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


7
2018-03-24 23:29



Como sockstat no estaba instalado de forma nativa en mi máquina, corté la respuesta de Stanford 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""

1
2018-03-17 18:31



Quería programáticamente - utilizando solo Bash - mata el proceso de escucha en un puerto determinado.

Digamos que el puerto es 8089, y 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 va a ayudar a mi equipo.


1
2018-03-28 23:48



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


0
2018-02-24 13:42