Saturday, December 12, 2009

Tutto sui processi in Linux: ps, pstree e procfs

Nel post di qualche mese fa ho parlato del fatto che:
Sarebbe molto interessante un software per visualizzare in tempo reale tutti i dettagli di quello che avviene "sotto" il sistema grafico, specialmente per quanto riguarda Linux. In particolare, penso che sarebbe molto istruttivo per imparare i comandi o per farsi un'idea di come funziona precisamente il sistema operativo.
Ovviamente si deve premettere che è indubbiamente meglio imparare ad usare una distribuzione Linux prima da terminale (possibilmente dedicandosi anche un po' alla programmazione di sistema) e poi nella versione grafica.
Comunque, per coloro che pur lavorando sempre con le GUI vogliono tenere sotto controllo il sub-sistema in ogni momento, oltre ad htop e top suggeriti nel post precedente, ci sono due comandi molto interessanti: ps e pstree.

Il comando ps fornisce diverse informazioni sui processi e thread del sistema ed è davvero molto completo per quanto riguarda le informazioni fornite e i parametri per filtrarle.
Il comando pstree mostra l'albero dei processi in esecuzione nel sistema. E' un comando molto utile anche quando si programma usando thread o funzioni fork in quanto permette di tenere precisamente sotto controllo la struttura di tutto quello che si crea.
Per entrambi i comandi esistono decine di parametri compresi quelli per visualizzare i singoli attributi passati ai vari processi in esecuzione. Per esempio:

ps -e -F
visualizza i dati di ogni processo sul sistema nel formato "full", ossia fornendo anche i parametri settati per il lancio di ogni processo. Mentre:

pstree -a
visualizza l'albero dei processi scompattando tutti i sottoalberi e fornendo, come prima, i command line arguments.

Per ulteriori informazioni sui processi in Linux esiste un filesystem virtuale all'interno del sistema: procfs. Digitando nel terminale:

cd /proc/
si entra nella directory di questo filesystem che non corrisponde a niente di fisico, ma si tratta appunto di uno "pseudo-filesystem usato per accedere alle informazioni relative ai processi fornite dal kernel" [Wikipedia]. La directory contiene una cartella per ogni processo, avente come nome il PID del processo stesso. Inoltre sono presenti altre cartelle o file generati al volo (dinamicamente in base alla richiesta dell'utente; infatti praticamente in ogni istante l'intero filesystem occupa 0 byte e pochissima memoria) utili per estrarre informazioni di ogni genere sui processi o sul kernel. In particolare è presente anche una link al processo corrente: /proc/self. Alcuni esempi di utilizzo:

cat /proc/PID/cmdline
visualizza gli argomenti usati per lanciare il processo identificato da PID;

cat /proc/meminfo
visualizza informazioni sulla memoria in uso nel sistema;

cat /proc/self/status
visualizza le informazioni base sullo stato e sulla memoria usata dal processo corrente.

Utilizzando in maniera opportuna:
  • htop (in particolare ordinando le colonne per "CPU%");
  • top (in particolare top -c per visualizzare tutti i parametri);
  • ps e pstree;
  • procfs;
si può ottenere una conoscenza completa di tutto quello che avviene al di sotto di un sistema grafico per Linux, più o meno in tempo reale.