Come scrivere uno shscript per uccidere -9 un pid che si trova tramite lsof -i


29

Sto usando Tomcat, e a volte quando gli dico di smettere non uccide correttamente il processo.

Anche il mio modo di aggirare questo è:

lsof -i tcp:8080

che produce:

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)

Quindi corro

kill -9 pid

Voglio un modo per ottenere tutti i numeri pid e ucciderli. Il fatto è che non so come isolare quel campo.


1
Se sei sicuro di avere solo un tomcatprocesso aperto, puoi usarekillall -9 tomcat
Joseph R.

Risposte:


57

C'è -tun'opzione (concisa) in lsof, che sembra fare esattamente ciò che stai cercando, ad es

$ sudo lsof -ti tcp:80
1387
4538
4539

Vedere 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.

Supponendo di disporre delle autorizzazioni necessarie, è possibile passare il risultato a killcome un elenco di PID con sostituzione dei comandi:

kill -9 $(lsof -ti tcp:80)

Ora hai risposto a entrambe le domande che ho fatto tra l'altro ;-)
user2757729

3

Non dimenticare l' --no-run-if-emptyopzione di uccidere :)

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

In questo modo uccidere verrà eseguito solo in un processo in ascolto, non è necessario eseguire il controllo da soli.


'--no-run-if-empty' non è supportato in BSD (mac)
dinesh ygv

1

lsof -i tcp:8080produce l'output, quindi | egrep -v "COMMAND PID USER"rilascia la riga di intestazione, quindi | awk '{print $2}'stampa il 2 ° campo, | sort -nprepara i numeri | uniq, che restituisce ogni PID univoco una sola volta. Mettere tutto insieme dà:

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

Ma, pkill -KILL tomcato killall -KILL tomcatè più facile.


Il processo Tomcat non è denominato "Tomcat", questo è il problema. È solo un normale processo Java, è necessario un ulteriore lavoro per identificare il processo corretto se ci sono altri processi Java in esecuzione contemporaneamente.
Terry Wang,

@TerryWang Yup, anche questo è il problema. La risposta di Steeldrivers funziona alla grande.
user2757729,

0

L'unica fodera di @waltinator è fantastica.

Aggiungerò più sapore ad esso:

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: questo è ancora molto semplice, potrebbe essere necessario aggiungere più sale e pepe per renderlo più robusto in un ambiente reale.


0

Questo è lo script che mi è venuto in mente con un po 'di controllo degli errori.

#!/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

0

Ecco una semplice funzione di guscio di pesce

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

basta inserire questa ventosa in un file in questa posizione ~/.config/fish/functions/kill-port.fishe sei pronto per partire. Puoi chiamarlo comekill-port 8000

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.