Wie man ein Shscript schreibt, um -9 eine PID zu töten, die über lsof -i gefunden wird


29

Ich benutze Tomcat und manchmal bricht es den Prozess nicht richtig ab, wenn ich ihm sage, dass er gestoppt werden soll.

Mein Weg um dies zu tun ist auch:

lsof -i tcp:8080

welche Ausgänge:

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)

Ich renne dann

kill -9 pid

Ich möchte einen Weg finden, um alle PID-Nummern zu erhalten und sie zu töten. Die Sache ist, dass ich nicht weiß, wie ich dieses Feld isolieren soll.


1
Wenn Sie sicher sind, dass Sie nur einen tomcatProzess geöffnet haben, können Sie verwendenkillall -9 tomcat
Joseph R.

Antworten:


57

Es gibt eine -t(knappe) Option lsof, die genau das tut, wonach Sie suchen, z

$ sudo lsof -ti tcp:80
1387
4538
4539

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

Vorausgesetzt, Sie verfügen über die erforderlichen Berechtigungen, können Sie das Ergebnis killals Liste von PIDs mit Befehlsersetzung übergeben:

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

Sie haben nun beide Fragen beantwortet, die ich übrigens gestellt habe ;-)
user2757729

3

Vergiss nicht die --no-run-if-emptyMöglichkeit zu töten :)

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

Auf diese Weise wird kill nur ausgeführt, wenn ein Prozess zuhört, und Sie müssen die Überprüfung nicht selbst durchführen.


'--no-run-if-empty' wird in BSD (Mac) nicht unterstützt
dinesh ygv

1

lsof -i tcp:8080erzeugt die Ausgabe, | egrep -v "COMMAND PID USER"löscht dann die Kopfzeile, | awk '{print $2}'druckt dann das 2. Feld, | sort -nbereitet die Zahlen für vor | uniq, wobei jede eindeutige PID nur einmal ausgegeben wird . Alles zusammen ergibt:

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

Aber pkill -KILL tomcatoder killall -KILL tomcatist einfacher.


Tomcat-Prozess heißt nicht "Tomcat", das ist das Problem. Es ist nur ein normaler Java-Prozess. Es muss zusätzliche Arbeit geleistet werden, um den richtigen Prozess zu identifizieren, wenn gleichzeitig andere Java-Prozesse ausgeführt werden.
Terry Wang

@ TerryWang Yup, das ist das Problem, das ich auch hatte. Die Antwort von Steeldrivers funktioniert hervorragend.
user2757729

0

Der One Liner von @waltinator ist großartig.

Ich werde es etwas mehr Geschmack hinzufügen:

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

ODER

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

HINWEIS: Dies ist immer noch sehr einfach. Möglicherweise müssen Sie mehr Salz und Pfeffer hinzufügen, um es in einer realen Umgebung robuster zu machen.


0

Dies ist das Skript, das ich mir mit ein wenig Fehlerprüfung ausgedacht habe.

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

Hier ist eine einfache Fischschalenfunktion

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

Stecken Sie diesen Sauger einfach in eine Datei an dieser Stelle ~/.config/fish/functions/kill-port.fishund schon können Sie loslegen. Du kannst es so nennenkill-port 8000

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.