Oneliner-Befehl zur Verwendung von kill mit der angegebenen TCP-Portnummer anstelle von PID?

8

Ich mache oft zB

sudo netstat -lpn |grep :8088

Ausgabe anzeigen

tcp6       0      0 :::8088                 :::*                    LISTEN      11189/java

und dann

sudo kill -kill 11189

Ich hätte gerne einen bequemeren Befehl, der genau so killatport 8088die TCP-Portnummer als Variable verwendet und den ich als Alias ​​für eine Pipeline erstellen kann, die das tut, was ich will, aber wie erhalte ich die PID aus der Ausgabe und der Pipe es zum töten Befehl? Ich nehme an, ich kann awk verwenden, um die PID von der Ausgabe von netstat zu erhalten, aber wie kann ich eine genaue Portübereinstimmung sicherstellen, damit die Eingabe 80 nicht mit 8080 übereinstimmt, und ebenso? Soll ich es stattdessen zu einem C-Programm machen? Oder gibt es schon so ein kleines Dienstprogramm?

Niklas
quelle
1
Die Verwendung von SIGKILL ist normalerweise eine schlechte Idee . Gibt es einen Grund, warum Sie nicht möchten, dass der Prozess nach sich selbst bereinigt wird?
Geirha
Das Stoppen des Servers mvn jetty:stopkönnte fehlschlagen, wenn die Instanz dies getan hat OutOfMemoryError. Wenn ich Java-Servlets neu starte, kommt es vor, dass der Port selbst bei einem regulären Stopp wie z mvn jetty:stop. Manchmal kann der Prozess OutOfMemoryErrorden TCP-Port bei einem regelmäßigen Herunterfahren wie z mvn jetty:stop.
Niklas
1
Dennoch mvn jetty:stopist nicht das gleiche SIGTERM wie das Senden und der Jvm sollte noch einmal zu verarbeiten SIGTERM der Lage sein , obwohl seine Anwendung (en) von mem ist aus.
Geirha

Antworten:

2

Ein Befehl kann folgendermaßen formuliert werden:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

Erläuterung:

  1. netstat -ltpn

    • Dies listet die Überwachungsports ( l) auf TCP ( t) und ihre Programme ( p) auf, ohne die Portnummern in Namen ( n) aufzulösen .
  2. grep ":1234\b"

    • Dies sucht nach :1234einer Grenze ( \b), die das Ende des Wortes (oder in unserem Fall die Zahl) angibt. Dies stellt sicher, dass wir :12345zum Beispiel nicht fangen .
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • Diese

      • Ersatz sub(/regex/,"replacewith", #fieldnumber)
      • diese Regex \/.*
      • mit nichts ""
      • im Feld $NF, dh das letzte Feld (dh das Feld, das enthält PID/program)
      • druckt es dann aus print $NF.

      Die Regex \/.*stimmt mit einem Literal /und allem danach überein , und dann ersetzen wir es durch nichts und löschen es im Wesentlichen, sodass nur die PID-Nummer in diesem Feld übrig bleibt.

  4. xargs -i kill -kill {}

    • xargs -iist ein Programm, mit dem Sie die Ausgabe des vorherigen Befehls als Eingabe für einen anderen Befehl verwenden können. Unser Befehl gibt kill -kill {}an, {}dass "die Ausgabe des vorherigen Befehls in der Pipeline" unsere PID-Nummer ist.

Hinweis: Dieser gesamte Befehl ist möglicherweise etwas gefährlich, da Sie möglicherweise versehentlich etwas töten, das Sie nicht wollten. Es könnte mit etwas mehr Desinfektion verwendet werden. Stellen Sie einfach sicher, dass Sie die richtige Portnummer erhalten, wenn Sie sie verwenden.

Wenn Sie dies zu einer Funktion machen möchten, können Sie Folgendes zu Ihrem hinzufügen ~/.bashrc:

killatport(){
    netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}

Speichern und übernehmen Sie die Änderungen mit source ~/.bashrc. Jetzt können Sie die Funktion folgendermaßen verwenden:

killatport 8088
Alaa Ali
quelle