Często robię np
sudo netstat -lpn |grep :8088
wyświetl wynik
tcp6 0 0 :::8088 :::* LISTEN 11189/java
i wtedy
sudo kill -kill 11189
Chciałbym mieć wygodniejszą komendę dokładnie taką, killatport 8088
która używa numeru portu TCP jako zmiennej i którą mogę utworzyć jako alias dla potoku, który robi to, co chcę, ale jak uzyskać PID z wyjścia i potoku to do polecenia zabicia? Przypuszczam, że mógłbym użyć awk, aby uzyskać PID z wyjścia z netstat, ale jak mogę zabezpieczyć i dopasować dokładny port, aby wejście 80 nie pasowało do 8080 i podobnie? Czy powinienem zamiast tego zrobić program w języku C? A może istnieje już takie małe narzędzie?
bash
scripts
command-line
kill
Niklas
źródło
źródło
mvn jetty:stop
może to zakończyć się niepowodzeniem, jeśli instancja maOutOfMemoryError
. Kiedy ponownie uruchamiam serwlety Java, zdarza się, że port jest niedostępny, nawet przy regularnym zatrzymaniu, takim jakmvn jetty:stop
. Czasami proces może uzyskaćOutOfMemoryError
i nie zwolnić portu TCP przy regularnym wyłączaniu, takim jakmvn jetty:stop
.mvn jetty:stop
nie jest tym samym, co wysyłanie SIGTERM, a jvm nadal powinien móc przetwarzać SIGTERM, nawet jeśli w jego aplikacjach brakuje pamięci.Odpowiedzi:
utrwalacz może to zrobić:
źródło
Polecenie można sformułować w następujący sposób:
Wyjaśnienie:
netstat -ltpn
l
) w TCP (t
) i ich programach (p
) bez rozdzielania numerów portów na names (n
).grep ":1234\b"
:1234
po nim granicę (\b
), wskazującą koniec słowa (lub w naszym przypadku cyfry). To:12345
gwarantuje , że nie złapiemy na przykład.awk '{sub(/\/.*/, "", $NF); print $NF}'
To
sub(/regex/,"replacewith", #fieldnumber)
\/.*
""
$NF
, co oznacza ostatnie pole (tj. pole zawierającePID/program
)print $NF
.Wyrażenie regularne
\/.*
dopasowuje literał/
i wszystko po nim, a następnie zastępujemy go niczym, zasadniczo usuwając go, więc pozostaje nam tylko numer PID w tym polu.xargs -i kill -kill {}
xargs -i
to program, który pozwala, aby dane wyjściowe z poprzedniego polecenia działały jako dane wejściowe do innego polecenia. Nasze polecenie tokill -kill {}
gdzie{}
wskazuje „wynik z poprzedniego polecenia w potoku”, który jest naszym numerem PID.Uwaga: całe to polecenie może być trochę niebezpieczne, ponieważ możesz przypadkowo zabić coś, czego nie chcesz. Przydałoby się to z nieco większą dezynfekcją. Po prostu upewnij się, że otrzymujesz poprawny numer portu podczas jego używania.
Jeśli chcesz zrobić z tego funkcję, możesz dodać do swojego
~/.bashrc
:Zapisz i zastosuj zmiany za pomocą
source ~/.bashrc
. Teraz możesz użyć takiej funkcji:źródło