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.


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)

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


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


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.