Il filesystem /proc è una caratteristica specifica di GNU/Linux. È un filesystem virtuale, e come tale non occupa spazio su disco. Esso rappresenta un mezzo molto comodo per ottenere informazioni sul sistema, anche perché gran parte dei file nella relativa directory sono facilmente leggibili (magari con un po' d'aiuto). Molti programmi in effetti prelevano informazioni dai file in /proc, le formattano a modo loro e poi le visualizzano; è il caso, ad esempio, di tutti i programmi che mostrano informazioni sui processi, alcuni dei quali abbiamo visto in precedenza (top, ps e simili). /proc rappresenta anche una buona fonte di informazioni riguardo al vostro hardware e, anche in questo caso, parecchi programmi non sono altro che interfacce verso le informazioni contenute in /proc.
Esiste anche una sotto-directory speciale, /proc/sys. Essa permette di visualizzare o modificare in tempo reale alcuni parametri del kernel.
Se osservate il contenuto della directory /proc vedrete molte directory il cui nome è un numero; quelle sono le directory che contengono informazioni su tutti i processi attualmente in corso di esecuzione nel sistema:
$ ls -d /proc/[0-9]* /proc/1/ /proc/302/ /proc/451/ /proc/496/ /proc/556/ /proc/633/ /proc/127/ /proc/317/ /proc/452/ /proc/497/ /proc/557/ /proc/718/ /proc/2/ /proc/339/ /proc/453/ /proc/5/ /proc/558/ /proc/755/ /proc/250/ /proc/385/ /proc/454/ /proc/501/ /proc/559/ /proc/760/ /proc/260/ /proc/4/ /proc/455/ /proc/504/ /proc/565/ /proc/761/ /proc/275/ /proc/402/ /proc/463/ /proc/505/ /proc/569/ /proc/769/ /proc/290/ /proc/433/ /proc/487/ /proc/509/ /proc/594/ /proc/774/ /proc/3/ /proc/450/ /proc/491/ /proc/554/ /proc/595/ |
Notate, però, che come utenti voi potete (giustamente) visualizzare solo le informazioni relative ai vostri processi, e non a quelli di altri utenti. Quindi proviamo a diventare root e a vedere che informazioni possiamo ottenere dal processo 127:
$ su Password: $ cd /proc/127 $ ls -l total 0 -r--r--r-- 1 root root 0 dic 14 19:53 cmdline lrwx------ 1 root root 0 dic 14 19:53 cwd -> // -r-------- 1 root root 0 dic 14 19:53 environ lrwx------ 1 root root 0 dic 14 19:53 exe -> /usr/sbin/apmd* dr-x------ 2 root root 0 dic 14 19:53 fd/ pr--r--r-- 1 root root 0 dic 14 19:53 maps| -rw------- 1 root root 0 dic 14 19:53 mem lrwx------ 1 root root 0 dic 14 19:53 root -> // -r--r--r-- 1 root root 0 dic 14 19:53 stat -r--r--r-- 1 root root 0 dic 14 19:53 statm -r--r--r-- 1 root root 0 dic 14 19:53 status $ |
Tutte le directory contengono gli stessi elementi; ecco una breve descrizione di alcuni di essi:
cmdline Questo (pseudo-)file contiene l'intera linea di comando che è stata utilizzata per avviare il processo. Non è formattata: non ci sono spazi tra il nome del programma e i suoi argomenti, e non c'è neanche il ritorno a capo a fine riga.
cwd Questo collegamento simbolico punta all'attuale directory di lavoro ("current working directory", da qui il nome) del processo.
environ Questo file contiene tutte le variabili d'ambiente definite per il processo, nella forma VARIABLE=valore. Come per cmdline, il contenuto non è minimamente formattato: nessun ritorno a capo, né per separare le diverse variabili, né alla fine.
exe Questo è un link simbolico che punta al file eseguibile corrispondente al processo in esecuzione.
fd Questa sotto-directory contiene la lista dei descrittori di file attualmente aperti dal processo. Si veda più avanti.
maps Stampando (ad esempio tramite cat) il contenuto di questa pipe denominata (o "pipe con nome") potrete vedere le sezioni dello spazio di indirizzamento del processo che sono attualmente assegnate a un file. I campi da sinistra a destra sono: lo spazio di indirizzamento relativo all'assegnazione, i permessi associati all'assegnazione, lo scostamento (ingl. "offset") da cui parte l'assegnazione rispetto all'inizio del file, il dispositivo su cui si trova il file a cui è assegnato lo spazio, il numero di inode del file, e infine il nome del file stesso. Si veda man 2 mmap.
root Questo è un collegamento simbolico che punta alla directory considerata come radice dal processo. Di solito questa sarà /, ma si veda anche man 2 chroot.
status Questo file contiene varie informazioni sul processo: il nome dell'eseguibile, il suo stato attuale, i suoi PID e PPID, i suoi UID e GID reali ed effettivi, il suo utilizzo di memoria, e altro ancora.
Visualizzando il contenuto della directory fd otterremo questo:
$ ls -l fd total 0 lrwx------ 1 root root 64 dic 16 22:04 0 -> /dev/console l-wx------ 1 root root 64 dic 16 22:04 1 -> pipe:[128] l-wx------ 1 root root 64 dic 16 22:04 2 -> pipe:[129] l-wx------ 1 root root 64 dic 16 22:04 21 -> pipe:[130] lrwx------ 1 root root 64 dic 16 22:04 3 -> /dev/apm_bios lr-x------ 1 root root 64 dic 16 22:04 7 -> pipe:[130] lrwx------ 1 root root 64 dic 16 22:04 9 -> /dev/console $ |
Questa, infatti, è la lista dei descrittori di file aperti dal processo. Ogni descrittore aperto è indicato da un collegamento simbolico, il cui nome è il numero del descrittore stesso, e il quale punta al file aperto tramite il descrittore[1]. Notate anche i permessi dei collegamenti simbolici: questo è l'unico caso in cui hanno senso, poiché rappresentano i permessi con i quali è stato aperto il file corrispondente al descrittore.
[1] | Se ricordate quello che abbiamo detto nella sezione La redirezione e le pipe, sapete già cosa rappresentano i descrittori 0, 1 e 2. |