Comando killall: terminare i processi per nome, il segnale -9 e installare psmisc
Il comando killall è un comando Linux che sceglie i processi in esecuzione in base al nome del programma invece che al numero di processo (PID) e invia loro un segnale; se non indichi un segnale, invia SIGTERM (secondo il manuale ufficiale). Poiché termina in una volta tutti i processi con lo stesso nome, su un server AlmaLinux 9 abbiamo prima controllato con pgrep e ps quattro processi avviati da copie di sleep con altri nomi; per un eseguibile con un nome di oltre 15 caratteri, nel nome del processo restavano solo i primi 15 caratteri.
Abbiamo eseguito killall solo su processi xxsleep avviati per il test con un account normale su un server Debian 12. I riquadri dei risultati mostrano l'output di rpm, pgrep, ps, pidof, cat e kill eseguiti con l'account root su un server AlmaLinux 9.8, e l'output di killall eseguito sul server Debian 12. I numeri di processo (PID), i nomi dei processi, i percorsi degli eseguibili e i nomi degli account sono stati sostituiti con valori di esempio.
1️⃣ Installare il comando killall
killall fa parte del pacchetto psmisc. Su un server AlmaLinux 9.8, controllando con rpm a quale pacchetto appartiene /usr/bin/killall, è comparsa la versione psmisc 23.4.
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4L'elenco dei file dello stesso pacchetto, visto con rpm -ql, comprendeva anche pstree e fuser.
Se compare [command not found], cioè che il comando non viene trovato, installa il pacchetto psmisc. Nella famiglia RHEL è [dnf install psmisc], nella famiglia Debian [apt install psmisc]. Sul server Debian 12 psmisc 23.6 era già installato, e killall si trovava in /usr/bin/killall.
Controllando sul server AlmaLinux 9.8, pkill, dal nome simile, era nel pacchetto procps-ng, e kill era un comando integrato della shell.
2️⃣ Come usare il comando killall
La forma di base è [killall nome del processo]. Trova tutti i processi in esecuzione con il nome indicato e invia loro un segnale; se scrivi più nomi, fa la stessa cosa per ciascun nome (secondo il manuale ufficiale).
Poiché i processi con lo stesso nome terminano tutti insieme, controlla prima con pgrep cosa è in esecuzione con quel nome. Abbiamo copiato sleep in una cartella di lavoro con i nomi xxsleep-a1, xxsleep-a2 e xxsleep-longname-x1, avviato xxsleep-a1 due volte, per quattro processi in tutto, e poi mostrato numeri e nomi con -l.
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnamNella quarta riga l'eseguibile si chiama xxsleep-longname-x1, ma il nome del processo era troncato a xxsleep-longnam.
Con -a compare l'intera riga di comando eseguita. I due xxsleep-a1 con lo stesso nome sono stati distinti dall'argomento finale in secondi, 300 e 310.
pgrep -a xxsleep2141 /root/work/xxsleep-a1 300
2142 /root/work/xxsleep-a1 310
2150 /root/work/xxsleep-a2 320
2155 /root/work/xxsleep-longname-x1 330Per trovare solo i processi il cui nome corrisponde esattamente, aggiungi -x. Il risultato per xxsleep-a1 è stato di due numeri.
pgrep -x xxsleep-a12141
2142Per controllare solo i numeri inserendo un nome così com'è, usa pidof. Cercando xxsleep-a1, i due numeri sono comparsi su una riga.
pidof xxsleep-a12142 2141ps mostra solo i processi il cui nome corrisponde esattamente se dopo -C scrivi più nomi separati da virgole.
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2Sul server Debian 12 abbiamo avviato quattro processi con gli stessi nomi ed eseguito [killall xxsleep-a1]: non ha mostrato nulla ed è terminato con codice di uscita 0. Cercando di nuovo con pgrep, i due xxsleep-a1 erano spariti e restavano solo xxsleep-a2 e xxsleep-longname-x1. Se al posto di un nome scrivi un percorso con una barra (/), sceglie i processi che eseguono quel file, qualunque sia il loro nome (secondo il manuale ufficiale).
Con il nome inesistente xxsleep-zz è comparsa una riga con [no process found] dopo il nome, ed è terminato con codice di uscita 1. Il codice di uscita è 0 solo quando per ogni nome indicato è stato terminato almeno un processo (secondo il manuale ufficiale).
killall xxsleep-zzxxsleep-zz: no process foundPer terminare un solo processo di cui conosci il numero, invia il segnale solo a quel numero con kill: Comando kill di Linux.
3️⃣ Opzioni del comando killall
Leggendo da /proc/PID/comm il nome del processo avviato come xxsleep-longname-x1, restavano solo i primi 15 caratteri: xxsleep-longnam.
cat /proc/2155/commxxsleep-longnamAbbiamo eseguito pgrep con xxsleep-longname, di 16 caratteri.
pgrep -a xxsleep-longnameÈ terminato senza output con codice di uscita 1, e cercando di nuovo con xxsleep-longnam, di 15 caratteri, è comparso quel processo.
pgrep -l xxsleep-longnam2155 xxsleep-longnamQuando killall riceve un nome di oltre 15 caratteri e ci sono processi di cui non riesce a leggere il nome completo, prende di mira tutti quelli i cui primi 15 caratteri corrispondono; con -e salta queste voci (secondo il manuale ufficiale). Sul server Debian 12, scrivendo i primi 15 caratteri xxsleep-longnam con -e e -v, sono comparse righe che indicavano che altri tre processi con il nome troncato a 15 caratteri erano stati saltati, ed è terminato con [no process found].
killall -e -v xxsleep-longnamkillall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
xxsleep-longnam: no process foundCon il nome completo xxsleep-longname-x1, dopo le stesse righe di salto è comparsa una riga con il segnale inviato a quel processo.
killall -e -v xxsleep-longname-x1killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
Killed xxsleep-longname-x1(2155) with signal 15Con -v, per ogni processo che ha ricevuto un segnale è comparsa una riga con nome, numero e numero del segnale.
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i chiede per ogni processo se terminarlo. Abbiamo riavviato due xxsleep-a1 e passato y e n in ordine tramite lo standard input: le due domande sono comparse di seguito su una riga, e solo il primo xxsleep-a1 è terminato, mentre il secondo è rimasto.
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u sceglie solo i processi che appartengono a quell'account, e se ometti il nome, il bersaglio sono tutti i processi di quell'account. Scrivendo anche xxsleep-a1 dopo il nome dell'account, il segnale è stato inviato solo all'xxsleep-a1 rimasto.
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o e -y scelgono in base all'ora di avvio, e il tempo si scrive con un numero seguito da un'unità s, m, h, d, w, M o y, come in [-o 30m].
-r legge i nomi come espressioni regolari estese. Passando il modello ^xxsleep-a a pgrep, sono comparsi tre processi che iniziano con xxsleep-a.
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w attende, controllando ogni secondo, finché tutti i processi che hanno ricevuto il segnale non spariscono. Se un processo ignora il segnale o resta come zombie, l'attesa può non finire mai.
La prima tabella qui sotto raccoglie i comandi di controllo e le opzioni di killall eseguiti davvero in questo articolo; le opzioni di killall non eseguite sono nella seconda tabella, secondo il manuale ufficiale.
📌 Controllare i processi e killall: risultati di questo articolo
| Comando | Compito | Risultato in questo articolo | |
|---|---|---|---|
| pgrep -l nome | Numero e nome dei processi il cui nome lo contiene | Quattro righe con xxsleep; il nome lungo si vede solo fino ai primi 15 caratteri, xxsleep-longnam | |
| pgrep -a nome | Numero e intera riga di comando | I due xxsleep-a1 con lo stesso nome distinti dagli argomenti finali 300 e 310 | |
| pgrep -x nome | Solo i numeri dei processi il cui nome corrisponde esattamente | Con xxsleep-a1 due righe: 2141 e 2142 | |
| pidof nome | I numeri in esecuzione con quel nome, su una riga | Con xxsleep-a1 2142 2141 | |
| ps -o pid,comm -C nome | Numero e nome dei processi il cui nome corrisponde esattamente; più nomi separati da virgole | Due righe di xxsleep-a1 e una di xxsleep-a2 | |
| cat /proc/PID/comm | Nome del processo (fino ai primi 15 caratteri) | 2155 è xxsleep-longnam | |
| killall nome | SIGTERM ai processi con quel nome | I due xxsleep-a1 terminati con codice di uscita 0; il nome inesistente xxsleep-zz ha dato no process found e codice di uscita 1 | |
| killall -e nome | Nomi di oltre 15 caratteri solo se il nome completo corrisponde | xxsleep-longnam ha dato no process found, xxsleep-longname-x1 terminato | |
| killall -v nome | Mostra il risultato per ogni processo che riceve il segnale | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i nome | Chiede conferma per ogni processo prima di terminarlo | Inserendo y e n, è terminato solo il primo xxsleep-a1 | |
| killall -u nome account | Solo i processi che appartengono a quell'account | Scritto insieme a un nome, è terminato solo l'xxsleep-a1 di quell'account | |
| killall -9 nome | SIGKILL invece di SIGTERM | Killed xxsleep-a2(2173) with signal 9 |
📎 Altre opzioni: secondo il manuale ufficiale
| Opzione | Compito | |
|---|---|---|
| -I, --ignore-case | Confronta i nomi senza distinguere maiuscole e minuscole | |
| -g, --process-group | Segnale al gruppo di processi invece che al processo (una volta per gruppo) | |
| -l, --list | Elenco dei nomi di segnale conosciuti | |
| -n, --ns PID | Solo i processi nello stesso namespace PID di quel PID; per impostazione predefinita, tutti i namespace | |
| -o, --older-than tempo | Solo i processi avviati prima di quel tempo (unità s, m, h, d, w, M, y) | |
| -q, --quiet | Non avvisa anche se nessun processo è stato terminato | |
| -r, --regexp | Legge i nomi come espressioni regolari estese | |
| -s, --signal segnale | Segnale da inviare al posto di SIGTERM | |
| -V, --version | Mostra le informazioni sulla versione | |
| -w, --wait | Attende finché tutti i processi che hanno ricevuto il segnale non spariscono | |
| -y, --younger-than tempo | Solo i processi avviati dopo quel tempo | |
| -Z, --context modello | Solo i processi il cui contesto di sicurezza corrisponde al modello di espressione regolare estesa; va scritto prima degli altri argomenti; il nome si può omettere |
🔲 Simulatore del comando killall
Il simulatore qui sotto parte da un elenco dei quattro processi xxsleep più l'xxsleep-a2 dell'account di esempio user1. Tocca i chip per confrontare quali righe spariscono dall'elenco con [killall -v], [-i] e [-u]; i testi di output di killall imitano l'output ottenuto sul server Debian 12.
4️⃣ Segnali di killall
Il segnale da inviare si scrive per nome, come [-HUP] o [-SIGHUP], per numero, come [-1], oppure dopo l'opzione -s (secondo il manuale ufficiale). [killall -9 nome del processo] invia il segnale 9, SIGKILL. SIGKILL è un segnale che il processo non può intercettare né ignorare (secondo il manuale ufficiale), quindi il processo termina senza poter fare pulizia. Per questo lo si invia quando il segnale predefinito, SIGTERM, non termina il processo.
Sul server Debian 12, aggiungendo -9 insieme a -v all'xxsleep-a2 riavviato, è comparsa una riga con il numero di segnale 9.
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9Abbiamo controllato nomi e numeri dei segnali con [kill -l]. Anche killall ha un'opzione -l che mostra i nomi di segnale che conosce.
kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAXInserendo un solo numero è comparso solo il nome di quel segnale. Il 15 che killall invia per impostazione predefinita era TERM, e il 9 inviato con -9 era KILL.
kill -l 15TERMkill -l 9KILLSe scrivi un nome di segnale che non è nell'elenco, compare un messaggio nella forma [FOO: unknown signal; killall -l lists signals.] (secondo il manuale ufficiale e i testi del programma).
🔢 FAQ & contenuti consigliati
Controllo in tempo reale
Comando top di Linux (controllare l'uso di CPU e memoria)
Comando che mostra in tempo reale quanta CPU e memoria usa ogni processo.
Controllo dei job
Background (Back Ground) e foreground (Fore Ground) in Linux: controllare i processi
Metodo di controllo dei job per mandare un comando in background e riportarlo in primo piano.
File aperti
[Linux] Comando lsof: mostrare le informazioni sui file in uso
Comando che mostra i file e i socket aperti da un processo, insieme al PID.
ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.