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 8088
die 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?
bash
scripts
command-line
kill
Niklas
quelle
quelle
mvn jetty:stop
könnte fehlschlagen, wenn die Instanz dies getan hatOutOfMemoryError
. Wenn ich Java-Servlets neu starte, kommt es vor, dass der Port selbst bei einem regulären Stopp wie zmvn jetty:stop
. Manchmal kann der ProzessOutOfMemoryError
den TCP-Port bei einem regelmäßigen Herunterfahren wie zmvn jetty:stop
.mvn jetty:stop
ist 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.Antworten:
Fixiereinheit kann das:
quelle
Ein Befehl kann folgendermaßen formuliert werden:
Erläuterung:
netstat -ltpn
l
) auf TCP (t
) und ihre Programme (p
) auf, ohne die Portnummern in Namen (n
) aufzulösen .grep ":1234\b"
:1234
einer Grenze (\b
), die das Ende des Wortes (oder in unserem Fall die Zahl) angibt. Dies stellt sicher, dass wir:12345
zum Beispiel nicht fangen .awk '{sub(/\/.*/, "", $NF); print $NF}'
Diese
sub(/regex/,"replacewith", #fieldnumber)
\/.*
""
$NF
, dh das letzte Feld (dh das Feld, das enthältPID/program
)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.xargs -i kill -kill {}
xargs -i
ist ein Programm, mit dem Sie die Ausgabe des vorherigen Befehls als Eingabe für einen anderen Befehl verwenden können. Unser Befehl gibtkill -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
:Speichern und übernehmen Sie die Änderungen mit
source ~/.bashrc
. Jetzt können Sie die Funktion folgendermaßen verwenden:quelle