Cómo escribir un shscript para matar -9 un pid que se encuentra a través de lsof -i

29

Estoy usando tomcat y, a veces, cuando le digo que se detenga, no mata correctamente el proceso.

Mi manera de evitar esto también es hacer:

lsof -i tcp:8080

que salidas:

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    888 root   35u  IPv6 780659      0t0  TCP *:http-alt (LISTEN)
java    888 root   39r  IPv6 790103      0t0  TCP localhost:58916->localhost:http-alt (CLOSE_WAIT)
java    888 root   40r  IPv6 792585      0t0  TCP localhost:58936->localhost:http-alt (CLOSE_WAIT)
java    888 root   75r  IPv6 785553      0t0  TCP localhost:58701->localhost:http-alt (CLOSE_WAIT)
java    888 root   77r  IPv6 787642      0t0  TCP localhost:58814->localhost:http-alt (CLOSE_WAIT)
java    888 root  130u  IPv6 783894      0t0  TCP localhost:58686->localhost:http-alt (CLOSE_WAIT)
java    888 root  353u  IPv6 780929      0t0  TCP localhost:58632->localhost:http-alt (CLOSE_WAIT)

Entonces corro

kill -9 pid

Quiero una forma de obtener todos los números pid y matarlos. La cosa es que no sé cómo aislar ese campo.

usuario2757729
fuente
1
Si está seguro de que solo tiene un tomcatproceso abierto, puede usarkillall -9 tomcat
Joseph R.

Respuestas:

57

Hay una -topción (breve) lsofque parece hacer exactamente lo que está buscando, es decir

$ sudo lsof -ti tcp:80
1387
4538
4539

Ver man lsof

-t       specifies  that  lsof should produce terse output with process
         identifiers only and no header - e.g., so that the output  may
         be piped to kill(1).  -t selects the -w option.

Suponiendo que tiene los permisos necesarios, puede pasar el resultado a killuna lista de PID con sustitución de comandos:

kill -9 $(lsof -ti tcp:80)
conductor de acero
fuente
Ahora ha contestado a las preguntas tanto de le he pedido por cierto ;-)
user2757729
3

No olvides la --no-run-if-emptyopción de matar :)

lsof -ti :8080 | xargs --no-run-if-empty kill -9

De esa forma, kill solo se ejecutará, hay un proceso de escucha, no es necesario que lo compruebes tú mismo.

SMF
fuente
'--no-run-if-empty' no es compatible con BSD (mac)
dinesh ygv
1

lsof -i tcp:8080produce la salida, luego | egrep -v "COMMAND PID USER"cae la línea del encabezado, luego | awk '{print $2}'imprime el segundo campo, | sort -nprepara los números para | uniq, que solo emite cada PID único una vez. Poner todo junto da:

 lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq  

Pero, pkill -KILL tomcato killall -KILL tomcates más fácil.

Waltinator
fuente
El proceso de Tomcat no se llama "tomcat", ese es el problema. Es solo un proceso normal de Java, se debe hacer un trabajo adicional para identificar el proceso correcto si hay otros procesos de Java ejecutándose al mismo tiempo.
Terry Wang
@TerryWang Sí, ese es el problema que tuve también. La respuesta de Steeldrivers está funcionando muy bien.
user2757729
0

El único revestimiento de @waltinator es genial.

Le agregaré más sabor:

lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9

O

kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq)

NOTA: esto sigue siendo muy básico, es posible que deba agregar más sal y pimienta para hacerlo más robusto en un entorno real.

Terry Wang
fuente
0

Este es el script que se me ocurrió con un poco de comprobación de errores.

#!/bin/bash

PORT=$1

if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
  printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\n"
  exit 1
fi

PID=$(lsof -ti:$PORT)

if ! [[ "$PID" =~ ^[0-9]+$ ]] ;
then
  printf "no proccess found, nothing to kill.\n"
  exit 0
fi

printf "killing process $PID running on $PORT\n"
kill -9 $PID
Loran
fuente
0

Aquí hay una función simple de concha de pescado

function kill-port
  set pids (lsof -ti tcp:$argv)
  if test $pids
    kill -9 $pids
  else
    echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv"
  end
end

simplemente pegue este lechón en un archivo en esta ubicación ~/.config/fish/functions/kill-port.fishy listo. Puedes llamarlo comokill-port 8000

codenamejames
fuente