Come eliminare un processo Linux in base al numero di porta
Pubblicato: 2022-10-08Per 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.
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
Su Fedora usa dnf
:
sudo dnf install socat
Su Manjaro devi digitare:
sudo pacman -S socat
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 &
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 &
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
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}'
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
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
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
Tuttavia, lsof
non riconosce il protocollo SCTP.
lsof -i sctp:7889
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
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}'
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}'
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
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
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.