A menudo hago, por ejemplo
sudo netstat -lpn |grep :8088
ver la salida
tcp6 0 0 :::8088 :::* LISTEN 11189/java
y entonces
sudo kill -kill 11189
Me gustaría tener un comando más conveniente exactamente como killatport 8088
ese que usa el número de puerto tcp como variable y que puedo hacer como un alias para una tubería que hace lo que quiero, pero ¿cómo obtengo el PID de la salida y la tubería? a la orden de matar? Supongo que podría usar awk para obtener el PID de la salida de netstat, pero ¿cómo protejo y hago una coincidencia de puerto exacta para que la entrada 80 no coincida con 8080 y lo mismo? ¿Debería convertirlo en un programa C? ¿O ya hay una pequeña utilidad como esta?
bash
scripts
command-line
kill
Niklas
fuente
fuente
mvn jetty:stop
podría fallar si la instancia tieneOutOfMemoryError
. Cuando reinicio los servlets de Java, sucede que el puerto no está disponible incluso en una parada regular comomvn jetty:stop
. A veces, el proceso puede obtenerOutOfMemoryError
y no liberará el puerto TCP en un apagado regular comomvn jetty:stop
.mvn jetty:stop
no es lo mismo que enviar SIGTERM, y la jvm aún debería poder procesar SIGTERM a pesar de que sus aplicaciones estén fuera de memoria.Respuestas:
El fusor puede hacer eso:
fuente
Un comando puede formularse así:
Explicación:
netstat -ltpn
l
) en TCP (t
) y sus programas (p
) sin resolver los números de puerto a los nombres (n
).grep ":1234\b"
:1234
seguido de un límite (\b
), que indica el final de la palabra (o número, en nuestro caso). Esto asegura que no atrapemos,:12345
por ejemplo.awk '{sub(/\/.*/, "", $NF); print $NF}'
Esta
sub(/regex/,"replacewith", #fieldnumber)
\/.*
""
$NF
, que significa el último campo (es decir, el campo que contienePID/program
)print $NF
.La expresión regular
\/.*
coincide con un literal/
y todo lo que está después, y luego lo reemplazamos por nada, esencialmente lo eliminamos, por lo que solo nos queda el número PID en ese campo.xargs -i kill -kill {}
xargs -i
es un programa que le permite hacer que la salida del comando anterior actúe como la entrada a otro comando. Nuestro comando eskill -kill {}
donde{}
indica "la salida del comando anterior en la tubería", que es nuestro número PID.Nota: todo este comando puede ser un poco peligroso porque podría matar accidentalmente algo que no quería. Se podría usar con un poco más de desinfección. Solo asegúrese de obtener el número de puerto correcto cuando lo use.
Si desea convertir esto en una función, puede agregar lo siguiente a su
~/.bashrc
:Guarde y aplique los cambios usando
source ~/.bashrc
. Ahora, puede usar la función de esta manera:fuente