Om een Linux-proces te beëindigen, heb je de ID of de naam nodig. Als alles wat je weet de poort is die het gebruikt, kun je het dan nog steeds doden? Ja, op verschillende manieren.
Moordende processen
Af en toe kan een Linux-proces niet meer reageren. Het kan stoppen met correct werken, of het kan blijven werken, maar verzoeken om het af te sluiten negeren, of geheugen, CPU of netwerkbandbreedte gaan opslokken.
Wat je motieven ook zijn, er zijn manieren om een proces te beëindigen vanaf de Linux-opdrachtregel. De klassieke methode is om het kill-commando te gebruiken met de proces-ID van het proces dat u wilt beëindigen. De kill
commando heeft enkele naaste verwanten. De pkill
commando zal een proces op naam doden, en killall
zal alle processen doden die het kan vinden die een deel van een naam delen.
Als alles wat je weet over een proces is dat het een poort op je computer gebruikt, zijn er nog steeds manieren om het te identificeren en te doden. In netwerktermen kan “poort” een fysieke verbinding betekenen waarin u een kabel plaatst met een stekker aan het uiteinde, zoals een CAT5- of 6-netwerkkabel, of het kan een softwarepoort betekenen.
Een softwarepoort is het laatste onderdeel van een netwerkverbinding. Het IP-adres van een apparaat identificeert de computer of ander netwerkapparaat. De toepassingen in de computer gebruiken verschillende poorten. Deze bieden een ander niveau van granulariteit. Het netwerkverkeer is via het IP-adres op de juiste computer terechtgekomen en kan door poortadressering bij de juiste applicatie worden afgeleverd.
Het is als post die aankomt in een hotel, wordt gesorteerd en afgeleverd bij de juiste kamers. Het IP-adres is als het adres van het hotel en de kamernummers zijn als de poortnummers.
Als u netwerkactiviteit op een poort ziet en u het proces dat de poort genereert niet herkent, of als het gedrag ervan problematisch of verdacht is, wilt u misschien het proces beëindigen. Zelfs als u alleen het poortnummer weet, kunt u het proces opsporen en beëindigen.
Verbindingen maken met socat
Zodat we wat connecties hebben om te doden, zullen we gebruiken socat
om netwerkverbindingen te maken met behulp van verschillende protocollen. U moet installeren socat
. Gebruik deze opdracht om het op Ubuntu te installeren:
sudo apt install socat
Bij Fedora-gebruik dnf
:
sudo dnf install socat
Op Manjaro moet je typen:
sudo pacman -S socat
De syntaxis voor socat
is eenvoudig als een beetje langdradig. We moeten de bron- en bestemmingsadressen opgeven. Voor elk van deze moeten we het protocol, het IP-adres en het poortnummer opgeven. We kunnen STDIN of STDOUT vervangen als bron of bestemming.
Deze opdracht maakt een verbinding tussen een TCP-luistersocket op poort 7889, op het loopback-IP-adres 127.0.0.1 en STDOUT. het ampersand “&
” voert de opdracht op de achtergrond uit, zodat we toegang tot de opdrachtregel behouden.
socat tcp-listen:7889,bind=127.0.0.1 stdout &
We zullen nog twee verbindingen maken, zodat we een kleine selectie sockets hebben die verschillende protocollen gebruiken. We maken een UDP-verbinding en een SCTP-verbinding. Het enige deel van de opdracht dat verandert, is het protocol.
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
Kill gebruiken
Natuurlijk kunnen we gebruiken kill
om het proces te beëindigen, zolang we maar weten wat de ID van het proces is. Om de PID te vinden, kunnen we de . gebruiken lsof
opdracht.
Om de details van het proces op poort 7889 weer te geven die het TCP-protocol gebruiken, gebruiken we de -i
(internetadres) optie, zoals deze.
lsof -i tcp:7889
De PID van dit proces is 3141, en we kunnen dat gebruiken met kill
:
sudo kill 3141
We kunnen ons wat moeite besparen als we leidingen gebruiken. Als we de uitvoer van lsof
naar binnen awk
en vertel awk
om regels te zoeken die de poort bevatten waarin we geïnteresseerd zijn – 7889 – en het tweede veld van die regel af te drukken, isoleren we de PID.
lsof -i tcp:7889 | awk '/7889/{print $2}'
We kunnen dan de uitvoer van awk
in de kill
commando met behulp van xargs
. De xargs
opdracht neemt zijn doorgesluisde invoer en geeft deze door aan een andere opdracht als opdrachtregelparameters. We gebruiken xargs
met de kill
opdracht.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
We krijgen geen visuele feedback. Op de typische Linux-manier is geen nieuws goed nieuws. Als u wilt controleren of het proces is beëindigd, kunt u gebruik maken van lsof
nog een keer.
lsof -i tcp:7889
Omdat lsof
niets meldt, weten we dat er geen verband is.
We kunnen een proces met het UDP-protocol verwijderen door simpelweg “tcp” te vervangen door “udp” in onze eerdere opdracht.
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
Echter, lsof
herkent het SCTP-protocol niet.
lsof -i sctp:7889
We kunnen de ss
opdracht om dat te doen. We gebruiken de -S
(SCTP) optie om te zoeken naar SCTP-sockets, de -a
(alle) optie om te zoeken naar alle soorten sockets (luisteren, accepteren, verbonden, etc.), en de -p
(processen) optie om de details van het proces weer te geven met behulp van de socket.
ss -Sap
We kunnen die uitvoer ontleden met grep
en awk
. We kunnen het ook ontleden met grep
en sommige PERL-regexen, maar deze manier is veel gemakkelijker te begrijpen. Als je dit meer dan een of twee keer zou gebruiken, zou je er waarschijnlijk een alias of shell-functie van maken.
We zullen de uitvoer van ss
naar binnen grep
en zoek naar ons poortnummer, 7889. We zullen de uitvoer van: grep
naar binnen awk
. In awk
we gebruiken de -F
(scheidingstekenreeks) optie om een komma in te stellen “,
” als het veldscheidingsteken. We zoeken naar een string bevattende “pid=”, en druk het tweede door komma’s gescheiden veld van die tekenreeks af.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}'
Dat heeft ons de string “pid=2859” gegeven.
We kunnen dat in awk
nogmaals, stel het veldscheidingsteken in op het isgelijkteken “=
” en druk het tweede veld af van Dat string, die de tekst achter het gelijkteken zal zijn.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
We hebben nu de proces-ID geïsoleerd. We kunnen gebruiken xargs
om de PID door te geven aan kill
als een opdrachtregelparameter.
ss -Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
Dat doodt het proces dat de SCTP-protocol-socket op poort 7889 gebruikte.
Het fuser-commando
De fuser
commando vereenvoudigt de zaken enorm. Het nadeel is dat het alleen werkt met TCP- en UDP-sockets. Positief is dat dit de twee meest voorkomende soorten sockets zijn waarmee u te maken krijgt. De fuser
opdracht was al geïnstalleerd op de Ubuntu-, Fedora- en Manjaro-computers die we hebben gecontroleerd.
Het enige dat u hoeft te doen, is de -k
(kill) optie, en geef de poort en het protocol op. U kunt ofwel de -n
(naamruimte) optie en geef het protocol en de poort op, of gebruik de “forward slash shortcut-indeling” en plaats het poortnummer eerst.
fuser -n tcp 7889
fuser 7889/udp
Het poortnummer, het protocol en de PID van het beëindigde proces worden afgedrukt in het terminalvenster.
Probeer eerst fuser
Het wordt waarschijnlijk geïnstalleerd op de computer waarop u werkt, en het protocol is waarschijnlijk TCP of UDP, dus de kans is groot dat de eenvoudigste manier voor u werkt.