Cum să omorâți un proces Linux după numărul de port

Publicat: 2022-10-08
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Pentru a distruge un proces Linux, aveți nevoie de ID-ul sau de numele acestuia. Dacă tot ceea ce știi este portul pe care îl folosește, mai poți să-l omorâți? Da, în mai multe moduri diferite.

Procese de ucidere

Ocazional, un proces Linux poate deveni fără răspuns. Poate să nu mai funcționeze corect sau să continue să funcționeze, dar să ignore cererile de închidere sau să înceapă să înghită memoria, procesorul sau lățimea de bandă a rețelei.

Cum să omorâți procesele din terminalul Linux
LEGATE Cum să omorâți procesele din terminalul Linux

Oricare ar fi motivele tale, există modalități de a ucide un proces din linia de comandă Linux. Metoda clasică este să utilizați comanda kill cu ID-ul procesului pe care doriți să îl încheiați. Comanda de kill are niște rude apropiate. Comanda pkill va ucide un proces după nume, iar killall va ucide toate procesele pe care le poate găsi care partajează o parte a unui nume.

Dacă tot ceea ce știi despre un proces este că folosește un port pe computer, mai există modalități de a-l identifica și de a-l ucide. În termeni de rețea, „port” poate însemna o conexiune fizică în care introduceți un cablu cu o mufă la capăt, cum ar fi un cablu de rețea CAT5 sau 6, sau poate însemna un port software.

Un port software este partea finală a unei conexiuni la rețea. Adresa IP a unui dispozitiv identifică computerul sau alt dispozitiv de rețea. Aplicațiile din interiorul computerului folosesc diferite porturi. Acestea oferă un alt nivel de granularitate. Traficul de rețea a ajuns la computerul corect folosind adresa IP, iar prin utilizarea adresei de port poate fi livrat la aplicația corectă.

Este ca și poșta care sosește la un hotel, apoi este sortată și livrată în camerele corespunzătoare. Adresa IP este ca adresa străzii a hotelului, iar numerele camerelor sunt ca numerele portului.

Dacă vedeți activitate de rețea pe un port și nu recunoașteți procesul care îl generează sau comportamentul acestuia este problematic sau suspect, este posibil să doriți să opriți procesul. Chiar dacă tot ceea ce știți este numărul portului, puteți urmări procesul și îl omorâți.

Crearea de conexiuni cu socat

Pentru a avea câteva conexiuni de eliminat, vom folosi socat pentru a crea conexiuni de rețea folosind diferite protocoale. Va trebui să instalați socat . Pentru a-l instala pe Ubuntu, utilizați această comandă:

 sudo apt install socat 

Instalarea socat pe Ubuntu

Pe Fedora folosiți dnf :

 sudo dnf install socat 

Instalarea socat pe Fedora

Pe Manjaro trebuie să tastați:

 sudo pacman -S socat 

Instalarea socat pe Manjaro

Sintaxa pentru socat este simplă, dacă este puțin lungă. Trebuie să furnizăm adresele sursă și destinație. Pentru fiecare dintre acestea, trebuie să furnizăm protocolul, adresa IP și numărul portului. Putem înlocui STDIN sau STDOUT ca sursă sau destinație.

Această comandă creează o conexiune între un soclu de ascultare TCP de pe portul 7889, pe adresa IP de buclă inversă a 127.0.0.1 și STDOUT. Ampersand „ & ” rulează comanda în fundal, astfel încât să păstrăm accesul la linia de comandă.

 socat tcp-listen:7889,bind=127.0.0.1 stdout & 

Crearea unei conexiuni de socket TCP de ascultare cu socat

Vom crea încă două conexiuni, astfel încât să avem o selecție mică de prize folosind protocoale diferite. Vom crea o conexiune UDP și o conexiune SCTP. Singura parte a comenzii care se schimbă este protocolul.

 socat udp-listen:7889,bind=127.0.0.1 stdout &
 socat sctp-listen:9999,bind=127.0.0.1 stdout & 

Crearea de conexiuni de soclu UDP și SCTP de ascultare cu socat

RELATE: Care este diferența dintre TCP și UDP?

Folosind Kill

Desigur, putem folosi kill pentru a încheia procesul, atâta timp cât știm care este ID-ul procesului. Pentru a găsi PID-ul, putem folosi comanda lsof .

Pentru a enumera detaliile procesului de pe portul 7889 care utilizează protocolul TCP, folosim opțiunea -i (adresă de internet), astfel.

 lsof -i tcp:7889 

Utilizarea lsof pentru a afișa detaliile unui proces folosind un anumit port și protocol

PID-ul acestui proces este 3141 și îl putem folosi cu kill :

 sudo kill 3141

Ne putem economisi ceva efort dacă folosim țevi. Dacă trimitem ieșirea lui lsof în awk și îi spunem lui awk să caute linii care conțin portul de care ne interesează — 7889 — și imprimăm al doilea câmp din acea linie, vom izola PID-ul.

 lsof -i tcp:7889 | awk '/7889/{printează $2}' 

Transmiterea ieșirii lui lsof în awk

Putem apoi trimite ieșirea de la awk în comanda kill folosind xargs . Comanda xargs preia intrarea sa pipetă și o transmite unei alte comenzi ca parametri de linie de comandă. Vom folosi xargs cu comanda kill .

 lsof -i tcp:7889 | awk '/7889/{printează $2}' | xargs ucide 

Folosind conducte pentru a prelua ieșirea lui lsof în awk și de la awk în xargs și ucide

Nu primim niciun feedback vizual. În mod tipic Linux, nicio veste nu este o veste bună. Dacă doriți să verificați dacă procesul a fost încheiat, puteți utiliza lsof încă o dată.

 lsof -i tcp:7889 

Utilizarea lsof pentru a căuta detaliile unui proces folosind un anumit port și un protocol fără succes

Pentru că lsof nu raportează nimic, știm că nu există o astfel de conexiune.

Putem elimina un proces folosind protocolul UDP pur și simplu înlocuind „tcp” cu „udp” în comanda noastră anterioară.

 lsof -i udp:7889 | awk '/7889/{printează $2}' | xargs ucide 

Folosind conducte pentru a prelua ieșirea lui lsof în awk și de la awk în xargs și kill, pentru un soclu UDP

Cu toate acestea, lsof nu recunoaște protocolul SCTP.

 lsof -i sctp:7889 

lsof nu funcționează cu protocolul SCTP

Putem folosi comanda ss pentru a face asta. Folosim opțiunea -S (SCTP) pentru a căuta socluri SCTP, opțiunea -a (toate) pentru a căuta toate tipurile de prize (ascultare, acceptare, conectată etc.) și opțiunea -p (procese) pentru a enumera detaliile procesului folosind socket-ul.

 ss -Sap 

Imprimarea detaliilor unui proces folosind un socket SCTP cu ss

Putem analiza acea ieșire folosind grep și awk . De asemenea, l-am putea analiza folosind grep și unele regexe PERL, dar acest mod este mult mai ușor de înțeles. Dacă ați folosi acest lucru de mai multe ori sau de două ori, probabil că ați face o funcție de alias sau shell din ea.

Vom canaliza ieșirea de la ss în grep și vom căuta numărul nostru de port, 7889. Vom trimite ieșirea de la grep în awk . În awk , folosim opțiunea -F (șir de separare) pentru a seta o virgulă „ , ” ca delimitator de câmp. Căutăm un șir care conține „pid=” și imprimăm al doilea câmp delimitat prin virgulă din acel șir.

 ss -Sap | grep "7889" | awk -F',' '/pid=/{printează $2}' 

Folosind conducte pentru a conecta ss, grep și awk pentru a extrage șirul PID

Asta ne-a dat șirul „pid=2859”.

Putem introduce din nou asta în awk , setăm delimitatorul câmpului la semnul egal „ = ” și tipărim al doilea câmp din acel șir, care va fi textul din spatele semnului egal.

 ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{printează $2}' 

Folosind conducte pentru a conecta ss, grep și awk de două ori, pentru a extrage PID-ul

Acum am izolat ID-ul procesului. Putem folosi xargs pentru a transmite PID-ul pentru a kill ca parametru de linie de comandă.

 ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{printează $2}' | xargs ucide 

Utilizarea conductelor cu ss, grep, awk și xargs pentru a termina un proces de socket SCTP

Asta oprește procesul care folosea soclul protocolului SCTP pe portul 7889.

Comanda cuptorului

Comanda fuser simplifică foarte mult lucrurile. Dezavantajul este că funcționează doar cu socket-uri TCP și UDP. În plus, acestea sunt cele mai comune două tipuri de prize cu care va trebui să vă ocupați. Comanda fuser a fost deja instalată pe computerele Ubuntu, Fedora și Manjaro pe care le-am verificat.

Tot ce trebuie să faceți este să utilizați opțiunea -k (kill) și să furnizați portul și protocolul. Puteți fie să utilizați opțiunea -n (spațiu de nume) și să furnizați protocolul și portul, fie să utilizați „formatul de comandă rapidă bară oblică” și să puneți numărul portului pe primul loc.

 fuzor -n tcp 7889
 cuptor 7889/udp 

Folosind comanda fuser pentru a șterge procesele folosind socket-uri TCP și UDP

Numărul portului, protocolul și PID-ul procesului încheiat sunt tipărite în fereastra terminalului.

Încercați mai întâi cuptorul

Probabil că va fi instalat pe computerul la care lucrați, iar protocolul este probabil TCP sau UDP, așa că există șanse mari ca cea mai simplă modalitate să funcționeze pentru dvs.