>_ Sistemi operativi e Linux

Processi su Linux: ps, top, kill e i segnali spiegati

Cosa sono i processi su Linux e come gestirli: PID, processo padre, stati, ps, top e htop, segnali SIGTERM e SIGKILL, priorità con nice e background.

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:

  • R in esecuzione o pronto a eseguire;
  • S in attesa di un evento, lo stato più comune;
  • D in attesa non interrompibile, di solito su disco o rete;
  • T fermato, per esempio con Ctrl+Z;
  • Z zombie: 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; pstree mostra chi ha avviato cosa.
  • ps aux, top e htop mostrano 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.
  • nice e renice abbassano la priorità dei lavori pesanti ma non urgenti.
  • Per lavori lunghi da remoto usa tmux o screen, non un semplice &.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica e in psicologia, unisce l'analisi tecnica alla comprensione del fattore umano.

Leggi anche