Come eliminare un processo Linux in base al numero di porta

Pubblicato: 2022-10-08
Laptop Linux che mostra un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Per terminare un processo Linux è necessario il suo ID o il suo nome. Se tutto ciò che sai è la porta che sta usando, puoi ancora ucciderlo? Sì, in diversi modi.

Processi di uccisione

Occasionalmente un processo Linux può non rispondere. Potrebbe smettere di funzionare correttamente, oppure potrebbe continuare a funzionare ma ignorare le richieste di arresto o iniziare a consumare memoria, CPU o larghezza di banda della rete.

Come eliminare i processi dal terminale Linux
CORRELATI Come eliminare i processi dal terminale Linux

Qualunque siano le tue motivazioni, ci sono modi per uccidere un processo dalla riga di comando di Linux. Il metodo classico consiste nell'utilizzare il comando kill con l'ID del processo che si desidera terminare. Il comando kill ha alcuni parenti stretti. Il comando pkill ucciderà un processo per nome e killall ucciderà tutti i processi che può trovare che condividono parte di un nome.

Se tutto ciò che sai su un processo è che sta usando una porta sul tuo computer, ci sono ancora modi per identificarlo e ucciderlo. In termini di rete, "porta" può significare una connessione fisica in cui si inserisce un cavo con una spina all'estremità, come un cavo di rete CAT5 o 6, oppure può significare una porta software.

Una porta software è la parte finale di una connessione di rete. L'indirizzo IP di un dispositivo identifica il computer o un altro dispositivo di rete. Le applicazioni all'interno del computer utilizzano porte diverse. Questi forniscono un altro livello di granularità. Il traffico di rete è arrivato al computer corretto utilizzando l'indirizzo IP e, utilizzando l'indirizzamento della porta, può essere inviato all'applicazione corretta.

È come la posta che arriva in un hotel, quindi viene smistata e consegnata nelle stanze appropriate. L'indirizzo IP è come l'indirizzo dell'hotel e i numeri delle camere sono come i numeri di porta.

Se vedi attività di rete su una porta e non riconosci il processo che la sta generando, o il suo comportamento è problematico o sospetto, potresti voler terminare il processo. Anche se tutto ciò che sai è il numero di porta, puoi rintracciare il processo e ucciderlo.

Creare connessioni con socat

In modo da avere alcune connessioni da eliminare, utilizzeremo socat per creare connessioni di rete utilizzando protocolli diversi. Dovrai installare socat . Per installarlo su Ubuntu, usa questo comando:

 sudo apt install socat 

Installazione di socat su Ubuntu

Su Fedora usa dnf :

 sudo dnf install socat 

Installazione di socat su Fedora

Su Manjaro devi digitare:

 sudo pacman -S socat 

Installazione di Socat su Manjaro

La sintassi per socat è semplice anche se un po' prolissa. Dobbiamo fornire gli indirizzi di origine e di destinazione. Per ognuno di questi, dobbiamo fornire il protocollo, l'indirizzo IP e il numero di porta. Possiamo sostituire STDIN o STDOUT come fonte o destinazione.

Questo comando crea una connessione tra un socket di ascolto TCP sulla porta 7889, sull'indirizzo IP di loopback di 127.0.0.1, e STDOUT. La e commerciale " & " esegue il comando in background, in modo da mantenere l'accesso alla riga di comando.

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

Creazione di una connessione socket TCP in ascolto con socat

Creeremo altre due connessioni in modo da avere una piccola selezione di socket che utilizzano protocolli diversi. Creeremo una connessione UDP e una connessione SCTP. L'unica parte del comando che cambia è il protocollo.

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

Creazione di connessioni socket UDP e SCTP in ascolto con socat

CORRELATI: Qual è la differenza tra TCP e UDP?

Usando Kill

Naturalmente, possiamo usare kill per terminare il processo, purché sappiamo qual è l'ID del processo. Per trovare il PID, possiamo usare il comando lsof .

Per elencare i dettagli del processo sulla porta 7889 che utilizza il protocollo TCP, utilizziamo l'opzione -i (indirizzo Internet), in questo modo.

 lsof -i tcp:7889 

Utilizzo di lsof per mostrare i dettagli di un processo utilizzando una porta e un protocollo specifici

Il PID di questo processo è 3141 e possiamo andare avanti e usarlo con kill :

 sudo kill 3141

Possiamo risparmiarci un po' di fatica se utilizziamo i tubi. Se conduciamo l'output di lsof in awk e diciamo ad awk di cercare le righe che contengono la porta a cui siamo interessati, 7889, e stampiamo il secondo campo da quella riga, isoleremo il PID.

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

Convogliando l'output di lsof in awk

Possiamo quindi reindirizzare l'output da awk al comando kill usando xargs . Il comando xargs prende l'input convogliato e lo passa a un altro comando come parametri della riga di comando. Useremo xargs con il comando kill .

 lsof -i tcp:7889 | awk '/7889/{stampa $2}' | xarg uccide 

Usare pipe per portare l'output di lsof in awk e da awk in xargs e kill

Non riceviamo alcun feedback visivo. Nel tipico modo di Linux, nessuna notizia è una buona notizia. Se vuoi controllare che il processo sia terminato, puoi usare lsof ancora una volta.

 lsof -i tcp:7889 

Utilizzo di lsof per cercare i dettagli di un processo utilizzando una porta e un protocollo specifici senza successo

Poiché lsof non riporta nulla, sappiamo che non esiste tale connessione.

Possiamo rimuovere un processo utilizzando il protocollo UDP semplicemente sostituendo "tcp" con "udp" nel nostro comando precedente.

 lsof -i udp:7889 | awk '/7889/{stampa $2}' | xarg uccide 

Utilizzo di pipe per portare l'output di lsof in awk e da awk in xargs e kill, per un socket UDP

Tuttavia, lsof non riconosce il protocollo SCTP.

 lsof -i sctp:7889 

lsof non funziona con il protocollo SCTP

Possiamo usare il comando ss per farlo. Stiamo usando l'opzione -S (SCTP) per cercare i socket SCTP, l'opzione -a (tutti) per cercare tutti i tipi di socket (ascolto, accettazione, connesso, ecc.) e l'opzione -p (processi) per elencare i dettagli del processo utilizzando il socket.

 ss -Sap 

Stampa dei dettagli di un processo utilizzando una presa SCTP con ss

Possiamo analizzare quell'output usando grep e awk . Potremmo anche analizzarlo usando grep e alcune espressioni regolari PERL, ma in questo modo è molto più facile da capire. Se dovessi usarlo più di una o due volte, probabilmente ne faresti un alias o una funzione di shell.

Invieremo l'output da ss a grep e cercheremo il nostro numero di porta, 7889. Invieremo l'output da grep a awk . In awk , utilizziamo l'opzione -F (stringa di separazione) per impostare una virgola " , " come delimitatore di campo. Cerchiamo una stringa contenente "pid=" e stampiamo il secondo campo delimitato da virgole da quella stringa.

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

Utilizzo di pipe per connettere ss, grep e awk per estrarre la stringa PID

Questo ci ha dato la stringa "pid=2859".

Possiamo reindirizzarlo nuovamente in awk , impostare il delimitatore di campo sul segno di uguale " = " e stampare il secondo campo da quella stringa, che sarà il testo dietro il segno di uguale.

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

Utilizzo di pipe per collegare ss, grep e awk due volte, per estrarre il PID

Ora abbiamo isolato l'ID del processo. Possiamo usare xargs per passare il PID da kill come parametro della riga di comando.

 ss -Sap | grep "7889" | awk -F',' '/pid=/{stampa $2}' | awk -F'=' '{stampa $2}' | xargs uccide 

Utilizzo di pipe con ss, grep, awk e xargs per terminare un processo socket SCTP

Ciò interrompe il processo che stava utilizzando il socket del protocollo SCTP sulla porta 7889.

Il comando fusore

Il comando fuser semplifica notevolmente le cose. Lo svantaggio è che funziona solo con socket TCP e UDP. Tra i lati positivi, questi sono i due tipi più comuni di prese con cui dovrai affrontare. Il comando fuser era già installato sui computer Ubuntu, Fedora e Manjaro che abbiamo controllato.

Tutto quello che devi fare è usare l'opzione -k (kill) e fornire la porta e il protocollo. È possibile utilizzare l'opzione -n ​​(spazio dei nomi) e fornire il protocollo e la porta, oppure utilizzare il "formato di collegamento barra in avanti" e inserire prima il numero di porta.

 fusore -n TCP 7889
 fusore 7889/udp 

Utilizzo del comando fusore per eliminare i processi utilizzando i socket TCP e UDP

Il numero di porta, il protocollo e il PID del processo terminato vengono stampati nella finestra del terminale.

Prova prima il fusore

Probabilmente sarà installato sul computer su cui stai lavorando ed è probabile che il protocollo sia TCP o UDP, quindi c'è una grande possibilità che il modo più semplice funzioni per te.