Come uccidere i processi dal terminale Linux

Uccidere un processo a volte è l’unico modo per sbarazzarsene. Nonostante il nome aspro, “uccidere” un processo significa semplicemente “costringerlo a smettere”. Ecco come farlo dalla riga di comando di Linux o macOS.

Cos’è un processo?

I programmi in esecuzione come il browser Web, i processi in background associati all’ambiente desktop ei servizi di sistema Linux sono tutti processi.

Puoi raggruppare i processi in due gruppi:

I processi in primo piano sono quelli che sono stati avviati o avviati da un utente. Possono essere in una finestra di terminale o possono essere un’applicazione grafica.
I processi in background sono tutti i processi che vengono avviati automaticamente e non hanno alcuna interazione con gli utenti. Non si aspettano input dagli utenti né presentano risultati o output. I processi in background sono cose come servizi e daemon.

Se i processi in primo piano sono la parte anteriore dello staff del teatro e gli attori, i processi in background sono il team del backstage “dietro le quinte”.

Quando i processi si comportano in modo anomalo o non funzionano correttamente, possono consumare troppo tempo della CPU, consumare la RAM o entrare in un ciclo di elaborazione ristretto e non rispondere. Le applicazioni grafiche possono rifiutarsi di rispondere ai clic del mouse. Le applicazioni terminali potrebbero non riportarti mai al prompt dei comandi.

La risposta umana

“Uccidere” un processo significa semplicemente “costringere il processo a terminare”. Ciò potrebbe essere necessario se il processo si rifiuta di rispondere.

Linux fornisce i comandi kill, pkill e killall per consentirti di fare proprio questo. Questi comandi possono essere utilizzati con qualsiasi tipo di processo, grafico o riga di comando, primo piano o sfondo.

Il comando kill

Per usare kill, devi conoscere l’ID di processo (PID) del processo che desideri terminare. Il comando ps può essere utilizzato per trovare il PID di un processo.

Per fare in modo che ps esegua la ricerca in tutti i processi, utilizzare l’opzione -e (tutti i processi). È consigliabile convogliare l’output attraverso less, ce ne sarà un bel po ‘. Digita ps, uno spazio, -e, uno spazio, | (un carattere pipe), un altro spazio e quindi digitare meno. Premere Invio per eseguire il comando.

ps -e | less

Questo ti darà un elenco di processi simile allo screenshot qui sotto. Puoi cercare in avanti in meno usando il tasto / e puoi cercare all’indietro usando il? chiave.

output di ps in una finestra less

Per individuare il processo che ti interessa, convogliare l’output da ps attraverso grep e specificare il nome, o parte del nome, del processo.

ps -e | grep shutter

Il comando ps è stato trasmesso tramite grep per trovare il processo di otturazione

Una volta individuato il PID del processo che desideri terminare, passalo al comando kill come parametro. Per terminare il processo di otturazione identificato dal comando precedente, utilizzare questo comando:

kill 2099

kill comando in una finestra di terminale

Il comando kill è un assassino silenzioso: non ti dà alcun feedback se ha avuto successo.

Il comando pkill

Il comando pkill consente di terminare uno o più processi in base al nome. Non è necessario identificare il processo tramite PID. Per utilizzare pkill, fornisci un termine di ricerca che pkill utilizza per confrontare l’elenco dei processi in esecuzione. I processi di abbinamento vengono terminati. Quindi devi essere sicuro di aver digitato correttamente il termine di ricerca.

Come rete di sicurezza, puoi usare il comando pgrep prima di usare il comando pkill. Il comando pgrep accetta anche un termine di ricerca. Elencherà il PID di ogni processo che corrisponde al termine di ricerca. Questo è sicuro perché pgrep non emetterà alcun segnale di kill ai processi, e se digiti erroneamente il termine di ricerca non ucciderai un altro processo per errore. Puoi assicurarti di aver pensato correttamente al termine di ricerca prima di passarlo a pkill. Sia pkill che pgrep trattano il termine di ricerca allo stesso modo. Il loro trattamento è così simile che loro condividere la stessa pagina man.

Supponiamo che ci sia un processo con “subq” nel nome. Useremo ps -u dave | comando grep per dare un’occhiata dietro le quinte. Puoi vedere che “subq” corrisponderà a quel processo e solo a quel processo. Solo così puoi vedere il nome completo del processo.

ps -u dave | grep subq

comando ps in una finestra di terminale

Supponiamo che il nostro utente non l’abbia fatto; tutto quello che sanno è che il nome del processo contiene la sottostringa “subq.” Usano pgrep per verificare che ci sia solo una corrispondenza con il termine di ricerca. Quindi usano quel termine di ricerca con pkill.

pgrep subq
pkill subq

pgrep e pkill in una finestra di terminale

Puoi usare pkill per uccidere più processi contemporaneamente. Qui l’utente esegue pgrep per controllare quanti processi ha avviato Chrome. Usano pkill per ucciderli tutti. Quindi controllano con pgrep che siano stati tutti rimossi.

pgrep chrome
pkill chrome
pgrep chrome

pgrep e pkill in una finestra di terminale

Se sono in esecuzione più processi con lo stesso nome, ma non si desidera ucciderli tutti, è possibile utilizzare pgrep con l’opzione -f (riga di comando) per identificare quale processo è quale. Un semplice esempio potrebbe essere due processi ping. Vuoi uccidere uno di loro ma non l’altro. Puoi usare le loro righe di comando per distinguerli. Notare l’uso delle virgolette per racchiudere il parametro della riga di comando.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

pgrep pkill con riga di comando ping

Il killall Command

Attenzione: nei sistemi operativi Solaris e OpenIndiana il comando killall ucciderà tutti i processi che ti appartengono. Se sei root o se hai emesso sudo killall riavvierai il tuo computer! Durante la ricerca per questo articolo, questo comportamento è stato confermato con l’ultima versione di OpenIndiana Hipster 2018.10.

Il comando killall funziona in modo simile al comando pkill ma con una differenza specifica. Invece di passare un termine di ricerca al comando, è necessario fornire il nome esatto del processo.

Non è possibile fornire una corrispondenza parziale a un nome di processo; è necessario fornire l’intero nome del processo, come mostrato:

killall shutt
killall shutter

comando killall in una finestra di terminale

L’opzione -y (minore di) consente di terminare i processi in esecuzione da meno di un periodo specificato. Il periodo è espresso in numeri seguiti da una di queste unità:

s (secondi)
m (minuti)
h (ore)
d (giorni)
w (settimane)
M (mesi, nota, “M” maiuscola)
y (anni)

Per terminare un processo chiamato ana che è stato appena avviato e lasciare in esecuzione eventuali istanze precedenti di ana, è possibile utilizzare i seguenti parametri con killall, se si reagisce entro due minuti:

killall -y 2m ana

killall con opzione minore

L’opzione -o (più vecchio di) consente di terminare i processi in esecuzione da più di un periodo specificato. Questo comando ucciderà tutte le connessioni ssh in esecuzione da più di un giorno:

killall -o 1d sshd

comando killall in una finestra di terminale

Non essere troppo felice

Questi comandi ti permetteranno di identificare e terminare correttamente i processi errati con precisione e sicurezza.

Sii sempre cauto. Innanzitutto, assicurati che il processo che stai per uccidere sia davvero quello che desideri. Secondo, ricontrolla: fai attenzione e assicurati che il processo mirato sia quello che desideri terminare. Procedi con l’interruzione del processo una volta che sei soddisfatto.