Jak zabić proces Linuksa według numeru portu?
Opublikowany: 2022-10-08Aby zabić proces Linuksa, potrzebujesz jego identyfikatora lub nazwy. Jeśli wszystko, co wiesz, to port, którego używa, czy nadal możesz go zabić? Tak, na kilka różnych sposobów.
Procesy zabijania
Czasami proces Linuksa może przestać odpowiadać. Może przestać działać poprawnie lub może kontynuować pracę, ale ignoruje żądania wyłączenia lub zaczyna pochłaniać pamięć, procesor lub przepustowość sieci.
Niezależnie od motywów, istnieją sposoby na zabicie procesu z wiersza poleceń Linuksa. Klasyczną metodą jest użycie polecenia kill z identyfikatorem procesu, który chcesz zakończyć. Polecenie kill
ma kilku bliskich krewnych. Polecenie pkill
zabije proces według nazwy, a killall
zabije wszystkie znalezione procesy, które współdzielą część nazwy.
Jeśli wszystko, co wiesz o procesie, to że używa portu na twoim komputerze, nadal istnieją sposoby na jego zidentyfikowanie i zabicie. W kategoriach sieciowych „port” może oznaczać fizyczne połączenie, do którego podłącza się kabel z wtyczką na końcu, taki jak przewód sieciowy CAT5 lub 6, lub może oznaczać port oprogramowania.
Port oprogramowania to ostatnia część połączenia sieciowego. Adres IP urządzenia identyfikuje komputer lub inne urządzenie sieciowe. Aplikacje wewnątrz komputera korzystają z różnych portów. Zapewniają one kolejny poziom szczegółowości. Ruch sieciowy dotarł do właściwego komputera przy użyciu adresu IP, a dzięki adresowaniu portów może zostać dostarczony do odpowiedniej aplikacji.
To tak, jakby poczta dotarła do hotelu, a następnie została posortowana i dostarczona do odpowiednich pokoi. Adres IP jest jak adres hotelu, a numery pokoi są jak numery portów.
Jeśli widzisz aktywność sieciową na porcie i nie rozpoznajesz procesu, który ją generuje lub jego zachowanie jest problematyczne lub podejrzane, możesz chcieć zabić ten proces. Nawet jeśli wszystko, co znasz, to numer portu, możesz wyśledzić proces i go zabić.
Tworzenie połączeń z socat
Aby mieć kilka połączeń do zabicia, użyjemy socat
do tworzenia połączeń sieciowych przy użyciu różnych protokołów. Musisz zainstalować socat
. Aby zainstalować go na Ubuntu, użyj tego polecenia:
sudo apt zainstaluj socat
W Fedorze użyj dnf
:
sudo dnf zainstaluj socat
Na Manjaro musisz wpisać:
sudo pacman -S socat
Składnia socat
jest prosta, jeśli jest trochę rozwlekła. Musimy podać adres źródłowy i docelowy. Dla każdego z nich musimy podać protokół, adres IP i numer portu. Możemy zastąpić STDIN lub STDOUT jako źródło lub miejsce docelowe.
To polecenie tworzy połączenie między gniazdem nasłuchującym TCP na porcie 7889, adresem IP sprzężenia zwrotnego 127.0.0.1 i STDOUT. Znak & „ &
” uruchamia polecenie w tle, dzięki czemu zachowujemy dostęp do wiersza poleceń.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
Stworzymy jeszcze dwa połączenia, dzięki czemu będziemy mieli mały wybór gniazd korzystających z różnych protokołów. Stworzymy połączenie UDP i połączenie SCTP. Jedyną częścią polecenia, która się zmienia, jest protokół.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
POWIĄZANE: Jaka jest różnica między TCP a UDP?
Korzystanie z Kill
Oczywiście możemy użyć kill
, aby zakończyć proces, o ile wiemy, jaki jest identyfikator procesu. Aby znaleźć PID, możemy użyć polecenia lsof
.
Aby wyświetlić szczegóły procesu na porcie 7889, który używa protokołu TCP, używamy opcji -i
(adres internetowy), w ten sposób.
lsof-i TCP: 7889
PID tego procesu to 3141 i możemy go użyć z kill
:
sudo zabić 3141
Zaoszczędzimy sobie trochę wysiłku, jeśli użyjemy rur. Jeśli przekażemy wyjście lsof
do awk
i nakażemy awk
wyszukanie wierszy zawierających interesujący nas port — 7889 — i wydrukowanie drugiego pola z tego wiersza, wyizolujemy PID.
lsof-i tcp:7889 | awk '/7889/{drukuj $2}'
Następnie możemy przekazać dane wyjściowe z awk
do polecenia kill
za pomocą xargs
. Polecenie xargs
pobiera dane wejściowe z potoku i przekazuje je do innego polecenia jako parametry wiersza poleceń. Użyjemy xargs
z poleceniem kill
.
lsof-i tcp:7889 | awk '/7889/{print $2}' | xargs zabić
Nie otrzymujemy żadnych wizualnych informacji zwrotnych. W typowym dla Linuksa sposób brak wiadomości to dobra wiadomość. Jeśli chcesz sprawdzić, czy proces został zakończony, możesz ponownie użyć lsof
.
lsof-i TCP: 7889
Ponieważ lsof
nic nie zgłasza, wiemy, że nie ma takiego związku.
Możemy usunąć proces za pomocą protokołu UDP, po prostu zastępując „tcp” słowem „udp” w naszym wcześniejszym poleceniu.
lsof-i udp:7889 | awk '/7889/{print $2}' | xargs zabić
Jednak lsof
nie rozpoznaje protokołu SCTP.
lsof-i sctp:7889
W tym celu możemy użyć polecenia ss
. Używamy opcji -S
(SCTP) do wyszukiwania gniazd SCTP, opcji -a
(all) do wyszukiwania wszystkich typów gniazd (nasłuchujących, akceptujących, połączonych itp.) oraz opcji -p
(procesy) aby wyświetlić szczegóły procesu przy użyciu gniazda.
ss -Sap
Możemy przeanalizować to wyjście za pomocą grep
i awk
. Moglibyśmy go również przeanalizować za pomocą grep
i niektórych wyrażeń regularnych PERL, ale ten sposób jest znacznie łatwiejszy do zrozumienia. Gdybyś miał użyć tego więcej niż raz lub dwa razy, prawdopodobnie stworzyłbyś z niego alias lub funkcję powłoki.
Przekażemy wyjście z ss
do grep
i poszukamy naszego numeru portu, 7889. Przekażemy wyjście z grep
do awk
. W awk
używamy opcji -F
(łańcuch oddzielający), aby ustawić przecinek „ ,
” jako ogranicznik pola. Szukamy ciągu zawierającego „pid=” i wypisujemy drugie pole oddzielone przecinkami z tego ciągu.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'
To dało nam ciąg „pid=2859”.
Możemy to ponownie przekazać do awk
, ustawić ogranicznik pola na znak równości „ =
” i wydrukować drugie pole z tego łańcucha, które będzie tekstem za znakiem równości.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
Teraz wyizolowaliśmy identyfikator procesu. Możemy użyć xargs
do przekazania PID do kill
jako parametru wiersza poleceń.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs zabić
To zabija proces, który używał gniazda protokołu SCTP na porcie 7889.
Polecenie utrwalacza
Polecenie fuser
znacznie upraszcza rzeczy. Minusem jest to, że działa tylko z gniazdami TCP i UDP. Z drugiej strony są to dwa najpopularniejsze typy gniazd, z którymi musisz sobie poradzić. Polecenie fuser
było już zainstalowane na sprawdzonych komputerach Ubuntu, Fedora i Manjaro.
Wszystko, co musisz zrobić, to użyć opcji -k
(zabić) i podać port i protokół. Możesz użyć opcji -n
(przestrzeń nazw) i podać protokół i port lub użyć "formatu skrótu z ukośnikiem do przodu" i najpierw umieścić numer portu.
utrwalacz -n tcp 7889
utrwalacz 7889/udp
Numer portu, protokół i PID zakończonego procesu są drukowane w oknie terminala.
Najpierw wypróbuj utrwalacz
Prawdopodobnie zostanie zainstalowany na komputerze, na którym pracujesz, a protokołem prawdopodobnie będzie TCP lub UDP, więc istnieje duża szansa, że najprostszy sposób zadziała.