Jak napisać skrypt, aby zabić -9 pid, który można znaleźć poprzez lsof -i

29

Używam tomcata, a czasami kiedy mówię mu, żeby przestał, nie zabija właściwie procesu.

Mój sposób na obejście tego też jest:

lsof -i tcp:8080

które wyjścia:

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)

Następnie biegnę

kill -9 pid

Chcę znaleźć wszystkie numery pid i je zabić. Chodzi o to, że nie wiem jak odizolować to pole.

użytkownik2757729
źródło
1
Jeśli jesteś pewien, że masz tomcatotwarty tylko jeden proces, możesz użyćkillall -9 tomcat
Joseph R.

Odpowiedzi:

57

Istnieje -topcja (zwięzła) lsof, która wydaje się robić dokładnie to, czego szukasz, tj

$ sudo lsof -ti tcp:80
1387
4538
4539

Widzieć 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.

Zakładając, że masz niezbędne uprawnienia, możesz przekazać wynik killjako listę PID z podstawieniem polecenia:

kill -9 $(lsof -ti tcp:80)
steeldriver
źródło
Odpowiedziałeś teraz na oba pytania, które zadałem btw ;-)
user2757729,
3

Nie zapomnij o --no-run-if-emptyopcji zabicia :)

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

W ten sposób zabójstwo zostanie uruchomione tylko wtedy, gdy proces nasłuchuje, a nie trzeba samemu sprawdzać.

SMF
źródło
„--no-run-if-empty” nie jest obsługiwane w BSD (mac)
dinesh ygv
1

lsof -i tcp:8080tworzy wynik, następnie | egrep -v "COMMAND PID USER"upuszcza wiersz nagłówka, a następnie | awk '{print $2}'drukuje drugie pole, | sort -nprzygotowuje liczby, dla | uniqktórych każdy unikalny PID jest wysyłany tylko raz. Połączenie tego wszystkiego daje:

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

Ale pkill -KILL tomcatlub killall -KILL tomcatjest łatwiejsze.

waltinator
źródło
Proces Tomcat nie jest nazywany „tomcat”, na tym polega problem. Jest to po prostu normalny proces Java, należy wykonać dodatkową pracę, aby zidentyfikować prawidłowy proces, jeśli w tym samym czasie działają inne procesy Java.
Terry Wang
@TerryWang Tak, to też miałem problem. Odpowiedź Steeldrivers działa świetnie.
user2757729,
0

Jedna wkładka z @waltinator jest świetna.

Dodam trochę więcej smaku:

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

LUB

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

UWAGA: jest to nadal bardzo podstawowe, może być konieczne dodanie więcej soli i pieprzu, aby uczynić go bardziej odpornym w prawdziwym środowisku.

Terry Wang
źródło
0

To jest skrypt, który wymyśliłem trochę sprawdzania błędów.

#!/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
źródło
0

Oto prosta funkcja skorupy ryby

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

po prostu włóż ten frajer do pliku w tej lokalizacji ~/.config/fish/functions/kill-port.fishi gotowe. Możesz to tak nazwaćkill-port 8000

codenamejames
źródło