Crea sito

Le proprietà dei processi

10 / 100

Il comando che permette di ottenere la lista dei processi attivi nel sistema e ps, il cui nome deriva da process status. Questo e uno dei comandi fondamentali presenti n dalle prime ver-sioni di Unix, per questo si sono accavallate anche diverse sintassi per le opzioni, derivate dalle varie versioni del comando che sono state realizzate nel tempo.

Il comando non richiede nessun argomento, e se eseguito su un terminale senza speci care nessuna opzione ps mostra l’elenco dei processi appartenenti all’utente che ha eseguito il comando attivi su quel terminale; avremo cioe qualcosa del tipo:

[email protected]:~/truedoc/corso$ ps

PIDTTYTIMECMD
10511pts/200:00:00bash
22461pts/200:00:22emacs
22746pts/200:00:03evince
22971pts/200:00:00ps

che mostra, nell’ultima colonna marcata CMD, come sul terminale siano presenti la shell, il co-mando ps stesso, piu l’editor ed il visualizzatore di PDF utilizzati per la realizzazione di questo testo. Tralasciamo per ora il signi cato delle altre colonne, ci torneremo fra poco. Specificando l’opzione \averranno visualizzati anche i processi lanciati da altri utenti, purche facenti riferimento ad un terminale, mentre con l’opzione \x” si visualizzano tutti i processi non associati ad un terminale, infine l’opzione \fpermette di mostrare la gerarchia dei processi.

La prima colonna dei precedenti esempi, marcata PID, mostra il cosiddetto process ID del processo.

Questo è il numero che il kernel utilizza per identificare univocamente ciascun processo; questo numero viene assegnato alla creazione del processo, ed è unico fintanto che il processo resta attivo. E questo il numero che si deve usare tutte le volte che si vuole fare riferimento ad uno speci co processo.

La seconda colonna, marcata TTY, mostra il nome del cosiddetto \terminale di controllo” del processo. Il concetto di \terminale di controllo” e alquanto complesso, per quanto ci interessa e su ciente dire che un processo \interattivo” e sempre associato ad un terminale di controllo che corrisponde appunto al terminale da cui il processo riceve i dati in ingresso (in genere dalla tastiera) e sul quale scrive il suo output (in genere lo schermo). I processi non interattivi (i cosiddetti demoni) che vengono usati per compiere una serie di compiti di servizio, come spedire la posta, eseguire lavori periodici, servire pagine web, ecc. dovendo essere attivi anche quando non c’e nessun utente collegato, lavorano invece come suol dirsi \in background” per cui non esiste un terminale di controllo ad essi associato e la colonna TTY riporta come valore \?“.

Per capire il significato del campo STAT occorrono alcune spiegazioni generali sull’architettura della gestione dei processi.

Come sistema multitasking Linux e in grado di eseguire piu processi contemporaneamente, in genere pero un processo, pur essendo attivo, non e assolutamente detto che sia anche in esecuzione. Il caso piu comune infatti e quello in cui il programma e in attesa di ricevere dati da una periferica; in tal caso il kernel pone il programma in stato di sleep e lo toglie dalla lista di quelli che hanno bisogno del processore (che sono identificati invece dallo stato runnable).

StatoSTATDescrizione
   
runnableRil processo e in esecuzione o e pronto ad essere eseguito (cioe
  e in attesa che gli venga assegnata la CPU).
sleepSil processo e in attesa di una risposta dal sistema, ma puo
  essere interrotto da un segnale.
uninterruptible sleepDil processo e in attesa di una risposta dal sistema (in genere
  per I/O), e non puo essere interrotto in nessuna circostanza.
stoppedTil processo e stato fermato con un SIGSTOP, o e tracciato.
zombieZil processo e terminato ma il suo stato di terminazione non e
  ancora stato letto dal padre.

Infine c’e lo stato di zombie, il cui significato puo essere compreso solo ritornando con maggiori dettagli sulla relazione fra processo padre e gli eventuali figli. La relazione padre/ figlio infatti e ben definita finche entrambi i processi sono attivi nel sistema, ma se uno dei due termina cosa accade?

Alla terminazione di un processo il kernel provvede ad una serie di compiti di pulizia; tutti i le aperti dal processo vengono chiusi, la memoria utilizzata viene liberata e con essa tutte le risorse occupate dal processo. Resta il problema di come noti care l’avvenuta conclusione del processo, ad esempio se questa e stata regolare o e stata dovuta ad un qualche errore, e il problema e a chi fare questa noti ca.

Dato che in un sistema Unix tutto viene fatto con i processi, la scelta e stata quella di assegnare al padre il compito di ricevere lo stato di uscita del glio e controllare se tutto e andato bene o c’e stato qualche errore. Quando un processo termina al padre viene inviato un apposito segnale che lo avvisa del fatto, e lui deve invocare una apposita system call per ricevere lo stato di uscita. Questo ad esempio e il meccanismo con cui la shell riceve lo stato di uscita dei comandi che si sono eseguiti.

Se questo non viene fatto il processo figlio si conclude comunque regolarmente e tutte le risorse che occupava nel sistema vengono rilasciate, resta allocata soltanto una voce nella tabella dei processi che contiene le informazioni per riportare lo stato di uscita.

Questo è quello che in gergo viene chiamato uno zombie, cioè un processo che non esiste più, perchè terminato, ma che mostra una voce con lo stato \Z” nella lista fornita da ps e che di nuovo non può essere terminato, per il semplice fatto che lo e già.

E pertanto compito di chi scrive programmi che creano processi gli curarsi della ricezione del loro stato di uscita, ed infatti i programmi ben scritti non presentano mai questo problema.

Di per se la presenza di uno zombie non e un grave problema, in quanto esso non occupa, a di erenza di un processo bloccato in stato \D“, nessuna risorsa nel sistema a parte la voce mantenuta nell’output di ps.

Pero la voce nella tabella dei processi resta occupata e pertanto se il numero degli zombie dovesse crescere in maniera eccessiva si puo rischiare di saturare quest’ultima, rendendo di fatto inutilizzabile il sistema, dato che non sar piu possibile creare nuovi processi. Ma a di erenza dei processi bloccati permanentemente in stato \D” per gli zombie e possibile risolvere il problema, e far s che essi siano terminati regolarmente, senza dover riavviare il sistema.

Le opzioni di visualizzazione di ps sono moltissime, e qui potremo prendere in esame solo le principali. Restando nell’ambito della sintassi BSD una delle piu usate e \u” che stampa una lista con le informazioni piu rilevanti riguardo l’utente che ha lanciato il programma. Altre opzioni sono \v” che stampa informazioni relative all’uso della memoria virtuale, e s che stampa informazioni sui segnali. In ne l’opzione \o” permette all’utente di speci care un suo formato, con l’uso di una serie di direttive %X, dove \X” indica quale proprieta del processo si vuole far comparire nella lista (secondo una tabella di valori riportata nella pagina di manuale).

Se invece si usa la sintassi SysV le opzioni piu usate sono -e, che permette di selezionare tutti i processi presenti, e -f che permette di avere una lista con piu informazioni; in tal caso infatti si avr come uscita del comando:

[email protected]:~$ ps -ef  
UIDPIDPPIDC STIMETTYTIME CMD
root10012:39?00:00:04 init [2]
root20012:39?00:00:00 [kthreadd]
root32012:39?00:00:00 [migration/0]
      
root2171012:39?00:00:00 udevd –daemon
root266217012:39?00:00:00 udevd –daemon
root279217012:39?00:00:00 udevd –daemon
root5082012:39?00:00:00 [kjournald]
root7241012:39?00:00:00 /usr/sbin/rsyslogd -c4
root7731012:39?00:00:00 /usr/sbin/acpid
daemon7861012:39?00:00:00 /usr/sbin/atd
root8131012:39?00:00:00 /usr/sbin/cron
10110691012:39?00:00:00 /usr/sbin/exim4 -bd -q30m
root10871012:39tty100:00:00 /bin/login —
root10881012:39tty200:00:00 /sbin/getty 38400 tty2
root10891012:39tty300:00:00 /sbin/getty 38400 tty3
root10901012:39tty400:00:00 /sbin/getty 38400 tty4
root10911012:39tty500:00:00 /sbin/getty 38400 tty5
root10921012:39tty600:00:00 /sbin/getty 38400 tty6
root10931087012:40tty100:00:00 -bash
root11481012:40?00:00:00 /usr/sbin/sshd
root11511148012:40?00:00:00 sshd: piccardi [priv]

Anzitutto notiamo che la prima colonna, UID, riporta un nome utente. Ciascun processo infatti mantiene le informazioni riguardanti l’utente che ha lanciato il processo ed il gruppo cui questo appartiene, il kernel infatti identi ca ogni utente e gruppo presente nel sistema con dei numeri interi, detti rispettivamente user ID (UID) e group ID (GID) che poi vengono abbinati a dei nomi simbolici come quelli riportati dal comando.

Ogni processo in realtà mantiene diverse versioni di questi identificatori, ma i piu significativi sono i l’exective user ID ed l’exective group ID, che vengono utilizzati per il controllo di accesso. I nomi corrispondenti a questi identificatori sono quelli che corrispondono alla colonna UID (e ad una eventuale colonna GID) del comando, ma e possibile anche richiedere il real user ID e il real group ID, che identificano l’utente che ha lanciato il processo, che invece vengono identificati da sigle come RUSER e RGROUP, se indicati con il nome o con RUID e RGID se numerici.

La seconda colonna del nostro esempio riporta di nuovo il PID di ciascun processo, mentre la terza colonna, PPID, indica il parent process ID, ogni processo infatti mantiene il PID del padre, in modo da poter ricostruire agevolmente la genealogia dei processi. Questa ci permette anche, in caso di zombie, di identificare il processo responsabile della produzione degli stessi.

La quarta colonna, C, indica il valore medio, espresso come intero, della percentuale di utilizzo della CPU su tutta la vita del processo. La quinta colonna, STIME, indica invece il momento in cui il comando e stato lanciato. Le altre colonne sono analoghe a quelle gia viste in precedenza per la sintassi BSD. Un elenco delle principali informazioni relative ai processi che vengono riportate da ps sono elencate in tab. 1.11, indicate sempre in base al nome usato come intestazione della colonna che ne visualizza il valore. Per l’elenco completo di opzioni, informazioni e dati visualizzabili si puo fare riferimento alla pagina di manuale del comando, accessibile con man ps.

Infine ci sono alcune proprietà dei processi, non immediatamente visualizzabili con ps, che comunque sono importanti e vanno menzionate. Come accennato ogni processo ha una directory di lavoro rispetto alla quale risolve i pathname relativi; anche questa e una caratteristica del processo, che viene ereditata nella creazione di un processo glio. Bench questo possa sembrare strano a prima vista, lo stesso vale per la directory radice, ogni processo cioe porta con se, oltre alla directory di lavoro corrente, anche l’indicazione della directory che considera come radice, rispetto alla quale risolve i pathname assoluti. Questa directory puo essere cambiata con una apposita system call (chiamata chroot) ottenendo cos che il processo venga in un certo senso ristretto all’interno di una parte dell’albero dei file

    
 ProprietaDescrizione 
    
 PIDPID, process ID del processo. 
 PPIDPPID, process ID del padre del processo. 
 UIDe ective user ID del processo. 
 GIDe ective group ID del processo. 
 CMDlinea di comando con cui e stato lanciato il processo. 
 STATstato del processo. 
 NIvalore di nice del processo. 
 TTYterminale di controllo del processo. 
 SIDSID, session ID del processo. 
 PGIDPGID, process group ID del processo. 
 %CPUpercentuale del tempo di CPU usato rispetto al tempo reale 
  di esecuzione. 
 %MEMpercentuale della memoria  sica utilizzata dal processo. 
 Cpercentuale di CPU sulla media della vita del processo. 
 STARTorario dell’avvio del processo. 
 TIMEtempo totale di CPU utilizzato dall’avvio del processo. 
 USEReffective user ID del processo. 
 RUSERreal user ID del processo. 
 GROUPeffective group ID del processo. 
 RGROUPreal group ID del processo. 
 COMMANDriga di comando con la quale si e avviato il processo. 

Tabella 1.11: Le principali proprieta dei processi ed il nome della relativa colonna nella visualizzazione effettuata da ps.

Come si puo notare ps si limita a stampare la lista dei processi attivi al momento della sua esecuzione. Se si vuole tenere sotto controllo l’attivit del sistema non e pratico ripetere in continuazione l’esecuzione di ps. Per questo ci viene in aiuto il comando top, che stampa una lista di processi, aggiornandola automaticamente in maniera periodica.

Il comando opera normalmente in maniera interattiva, a meno di non averlo lanciato con l’opzione -b, che lo esegue in modalit batch, consentendo la redirezione dell’output; in tal caso di solito si usa anche l’opzione -n per speci care il numero di iterazioni volute. Il comando ristampa la lista ogni secondo, a meno di non aver impostato un intervallo diverso con l’opzione -d, che richiede un parametro nella forma ss.dd dove ss sono i secondi e dd i decimi di secondo. In ne l’opzione -p permette di osservare una lista di processi scelta dall’utente, che deve speci carli tramite una lista di PID. Per la lista completa delle opzioni si faccia riferimento al solito alla pagina di manuale, accessibile con man top. Quando opera in modalit interattiva il comando permette di inviare dei comandi da tastiera. I piu rilevanti sono \h” e \?” che mostrano un help in linea dei comandi disponibili, e \q” che termina il programma

Translate »