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 sottodirectory 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. Per poterlo vedere potete digitare perl -pl -e 's,\00, ,g' cmdline.
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. Un modo per vederlo è digitare perl -pl -e 's,\00,\n,g' environ.
exe: questo è un link simbolico che punta al file eseguibile corrispondente al processo in esecuzione.
fd: questa sottodirectory 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 inodo del file, e infine il nome del file stesso. Quando il dispositivo è 0 e non è presente né numero di inodo né il nome del file, si tratta di assegnazioni anonime. Si veda mmap(2).
root Questo è un collegamento simbolico che punta alla directory considerata come radice dal processo. Di solito questa sarà /, ma si veda anche chroot(2).
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, sempre per il processo 127, otterremo quanto segue:
$ 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. |