Ogni programma in esecuzione su Linux è un processo: il browser, la shell in cui scrivi, il server web, perfino il comando ls per la frazione di secondo in cui lavora. Saper osservare i processi e intervenire quando qualcosa si blocca o consuma troppe risorse è una delle competenze più utili per chi amministra un sistema, anche solo il proprio portatile.
PID, processo padre e albero dei processi
Ogni processo ha un numero identificativo, il PID, e un processo padre che lo ha creato, identificato dal PPID. Quando lanci firefox da un terminale, la shell è il padre di Firefox. Risalendo l'albero si arriva al processo con PID 1, che sulle distribuzioni moderne è quasi sempre systemd: è il primo processo avviato dal kernel e l'antenato di tutti gli altri.
Il comando pstree disegna questo albero e mostra chi ha avviato cosa.
Elencare i processi con ps
ps da solo mostra solo i processi del terminale corrente. Le varianti più usate sono:
ps aux: tutti i processi di tutti gli utenti, con uso di CPU e memoria;ps -ef: stesso elenco in un formato diverso, con il PPID in evidenza;ps aux --sort=-%mem | head: i processi che occupano più memoria.
Per cercare un programma specifico si combina con grep, oppure si usa direttamente pgrep -a nome, che restituisce PID e riga di comando senza includere sé stesso nei risultati.
Osservare in tempo reale: top e htop
top mostra un elenco aggiornato ogni pochi secondi. In alto ci sono il carico medio (load average) su 1, 5 e 15 minuti, l'uso della CPU e della memoria. Alcuni tasti utili dentro top:
| Tasto | Azione |
|---|---|
P |
ordina per uso della CPU |
M |
ordina per uso della memoria |
k |
invia un segnale a un processo |
1 |
mostra ogni core separatamente |
q |
esce |
htop, spesso da installare a parte, offre la stessa informazione con colori, barre per ogni core e la possibilità di scorrere e selezionare i processi con le frecce.
Il carico medio va letto in rapporto al numero di core: un valore di 4 su una macchina con 4 core indica un sistema pienamente occupato, su una con 16 core un sistema tranquillo.
Gli stati di un processo
Nella colonna STAT di ps o S di top compare una lettera:
Rin esecuzione o pronto a eseguire;Sin attesa di un evento, lo stato più comune;Din attesa non interrompibile, di solito su disco o rete;Tfermato, per esempio conCtrl+Z;Zzombie: terminato, ma il padre non ne ha ancora raccolto lo stato di uscita.
Molti processi in stato D indicano spesso un disco lento o un'unità di rete che non risponde. Gli zombie non consumano CPU né memoria significativa; se si accumulano, il problema è il processo padre che non li raccoglie.
Segnali: chiedere e imporre la chiusura
Il comando kill non serve solo a uccidere: invia un segnale a un processo. I più importanti sono:
- SIGTERM (15): la richiesta educata di terminare. È il segnale predefinito di
kill. Il programma può intercettarlo, salvare i dati e chiudersi in ordine. - SIGKILL (9): la chiusura forzata. Il kernel termina il processo immediatamente, senza dargli modo di reagire. I dati non salvati vanno persi.
- SIGHUP (1): storicamente la chiusura del terminale; molti servizi lo usano come comando per rileggere la configurazione.
- SIGINT (2): quello che invii premendo
Ctrl+C. - SIGSTOP e SIGCONT: sospendono e riprendono un processo.
La regola pratica è tentare sempre prima con SIGTERM e passare a SIGKILL solo se dopo qualche secondo il processo è ancora lì:
kill 4321 # SIGTERM
sleep 5
kill -9 4321 # solo se necessario
pkill nome e killall nome inviano il segnale per nome invece che per PID; conviene verificare prima con pgrep -a nome quali processi verranno colpiti. Un processo in stato D può non rispondere nemmeno a SIGKILL finché l'operazione su cui è bloccato non si conclude.
Priorità: nice e renice
Linux distribuisce la CPU tra i processi in base anche al valore nice, che va da -20 (priorità massima) a 19 (priorità minima). Un'operazione pesante ma non urgente, come una compressione di archivi, si può avviare con bassa priorità:
nice -n 15 tar -czf archivio.tar.gz cartella/
Per un processo già in esecuzione si usa renice. Gli utenti normali possono solo abbassare la priorità dei propri processi; alzarla richiede i privilegi di amministratore.
Lavori in primo piano e in background
Nella shell, aggiungere & alla fine di un comando lo avvia in background. Ctrl+Z sospende il comando in primo piano, bg lo fa ripartire in background, fg lo riporta in primo piano e jobs elenca i lavori della sessione. Se chiudi il terminale, però, i lavori ricevono SIGHUP e di norma terminano: per operazioni lunghe su un server conviene usare nohup, oppure un multiplexer come tmux o screen, che mantiene viva la sessione anche se la connessione cade.
In sintesi
- Ogni processo ha un PID e un padre;
pstreemostra chi ha avviato cosa. ps aux,topehtopmostrano consumo di CPU e memoria; il carico va confrontato con il numero di core.- Usa prima SIGTERM e solo dopo SIGKILL, che non lascia al programma il tempo di salvare.
niceereniceabbassano la priorità dei lavori pesanti ma non urgenti.- Per lavori lunghi da remoto usa
tmuxoscreen, non un semplice&.