[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
Le informazioni sulla situazione dei processi vengono ottenute a partire dalla tabella dei processi messa a disposizione dal kernel. Dal momento che il meccanismo attraverso cui queste informazioni possono essere ottenute dal kernel non è standardizzato per tutti i sistemi Unix, questi programmi che ne permettono la consultazione hanno raramente un funzionamento conforme.
Il meccanismo utilizzato in particolare dal kernel Linux è quello del file system virtuale innestato nella directory /proc/
. A questo proposito, è il caso di osservare che il pacchetto dei programmi di servizio che permettono di conoscere lo stato dei processi è denominato Procps, in riferimento a questa particolarità del kernel Linux.
|
Il controllo dello stato dei processi esistenti avviene fondamentalmente attraverso l'uso di ps, (1) pstree (2) e top. (3) Il primo mostra un elenco di processi e delle loro caratteristiche, il secondo un albero che rappresenta la dipendenza gerarchica dei processi e il terzo l'evolversi dello stato di questi.
I programmi ps e pstree rappresentano la situazione di un istante: il primo si presta per eventuali rielaborazioni successive, mentre il secondo è particolarmente adatto a seguire l'evoluzione di una catena di processi, specialmente quando a un certo punto si verifica una transizione nella proprietà dello stesso (UID).
#
ps
[Invio]
PID TTY STAT TIME COMMAND 374 1 S 0:01 /bin/login -- root 375 2 S 0:00 /sbin/mingetty tty2 376 3 S 0:00 /sbin/mingetty tty3 377 4 S 0:00 /sbin/mingetty tty4 380 5 S 0:00 /sbin/mingetty tty5 382 1 S 0:00 -bash 444 p0 S 0:00 su 445 p0 S 0:00 bash 588 p0 R 0:00 ps |
$
pstree -u -p
[Invio]
init(1)-+-atd(868,daemon) |-bdflush(6) |-boa(728,www-data) |-cron(871) |-devfsd(40) |-diskmond(812) |-getty(879) |-getty(882) ... |-sh(881,tizio)---startx(889)---xinit(900)-+-Xorg(901,root) | `-xinitrc(905)---fvwm2(907) ... `-xinetd(857) |
Invece, il programma top impegna un terminale (o una finestra di terminale all'interno del sistema grafico) per mostrare costantemente l'aggiornamento della situazione. Si tratta quindi di un controllo continuo, con l'aggiunta però della possibilità di interferire con i processi inviandovi dei segnali o cambiandone il valore nice.
|
I programmi che visualizzano la situazione dei processi, utilizzano spesso delle sigle per identificare alcune caratteristiche. La tabella 67.5 ne descrive alcune.
In particolare, lo stato del processo rappresentato dalla sigla STAT, viene descritto da una o più lettere alfabetiche il cui significato viene riassunto nella tabella 67.6.
|
Il programma ps visualizza un elenco dei processi in corso di esecuzione. Se non viene specificato diversamente, si ottiene solo l'elenco dei processi che appartengono all'utente.
ps [opzioni] [pid... ] |
Dopo le opzioni possono essere indicati esplicitamente i processi (in forma dei numeri PID) in modo da ridurre a loro l'elenco ottenuto.
|
Segue la descrizione di alcune opzioni. Si osservi che le opzioni rappresentate da un carattere singolo, possono iniziare eventualmente con un trattino, come avviene nella maggior parte dei comandi Unix, ma si tratta di un'eccezione, dal momento che il programma ps standard non le utilizza.
|
Segue la descrizione di alcuni esempi.
$
ps
[Invio]
Elenca i processi appartenenti all'utente che dà il comando.
$
ps a l
[Invio]
Elenca tutti i processi utilizzando un formato più ampio in modo da fornire più dettagli sui processi.
$
ps a r
[Invio]
Elenca tutti i processi in funzione escludendo quelli in pausa.
$
ps a l OUr
[Invio]
Elenca tutti i processi in formato allargato e riordinato per UID (numero utente) e quindi in base alla dimensione residente in memoria dei processi.
$
ps a l --sort=uid,rss
[Invio]
Equivalente all'esempio precedente.
Il programma pstree visualizza uno schema ad albero dei processi in corso di esecuzione. È possibile specificare un numero di processo (PID), oppure il nome di un utente per limitare l'analisi.
pstree [opzioni] [PID | utente] |
Di solito, quando da uno stesso genitore si diramano diversi processi con lo stesso nome, questi vengono raggruppati. Per cui, l'esempio seguente rappresenta un gruppo di quattro processi getty, tutti discendenti da Init:
$
pstree
[Invio]
init-+-... ... |-4*[getty] ... |
|
Segue la descrizione di alcuni esempi.
$
pstree -a
[Invio]
Mostra l'albero dei processi elaborativi, con la riga di comando usata per avviarli. In questo caso, i processi multipli non vengono raccolti assieme.
init |-acpid -c /etc/acpi/events -s /var/run/acpid.socket |-atd ... |-dhcpd3 -q eth0 ... `-ypbind |-{ypbind} `-{ypbind} |
$
pstree -p
[Invio]
Mostra l'albero dei processi elaborativi, con l'indicazione del numero PID per ognuno.
init(1)-+-acpid(6342) |-atd(7377) ... |-dhcpd3(5725) ... `-ypbind(6246)-+-{ypbind}(6247) `-{ypbind}(6248) |
$
pstree -u
[Invio]
Mostra l'albero dei processi elaborativi, con l'indicazione del cambiamento di utente per conto del quale sono avviati.
init-+-acpid |-atd(daemon) ... |-dhcpd3 ... |-login---sh(tizio)-+-ssh | `-startx---xinit-+-Xorg(root) | `-sh-+-fvwm2-+-FvwmTaskBar | | |-... | | `-... | `-tee ... `-ypbind---2*[{ypbind}] |
Dal risultato, si intende che i processi senza indicazione del nome dell'utente, sono avviati con gli stessi privilegi del processo che a sua volta li genera. Per quanto riguarda init, si intende che stia funzionando con i privilegi dell'utente root. Dall'esempio, si vede che il processo denominato Xorg, ottiene i privilegi dell'utente root, pur essendo avviato da un processo che ha solo i privilegi dell'utente tizio, quindi deve essere stato avviato con i «permessi» SUID-root.
Il programma top visualizza la situazione sull'utilizzo delle risorse di sistema attraverso una tabella dell'attività principale della CPU, cioè dei processi che la impegnano maggiormente.
top [opzioni] |
Lo schema viene aggiornato a brevi intervalli, di conseguenza, impegna un terminale. Durante il suo funzionamento, top accetta dei comandi espressi con un carattere singolo.
|
Il programma top accetta una serie di comandi interattivi, espressi da un carattere singolo, che sono descritti nella tabella successiva.
|
Il programma htop (4) visualizza la situazione sull'utilizzo delle risorse di sistema, in modo simile a top, ma offrendo la possibilità di scorrere l'elenco di tutti i processi, utilizzando comandi interattivi più comodi:
htop |
Inizialmente, htop si presenta così:
$
htop
[Invio]
|
Attraverso i tasti [freccia su] e [freccia giù] è possibile scorrere l'elenco dei processi elaborativi presenti, mentre con la [Barra spaziatrice] è possibile selezionare uno o più processi. Nella parte inferiore dello schermo vengono riepilogati i comandi principali, che si impartiscono attraverso l'uso dei primi dieci tasti funzionali.
|
A volte è importante conoscere se un file è utilizzato da qualche processo. Per questo si possono utilizzare i programmi Fuser (5) e Lsof, (6) che sono in grado di dare qualche informazione aggiuntiva del modo in cui tale file viene utilizzato.
Fuser si compone in pratica dell'eseguibile fuser, che si utilizza con la sintassi seguente:
fuser [opzioni] file... |
Il compito normale di Fuser è quello di elencare i processi che utilizzano i file indicati come argomento. In alternativa, fuser permette anche di inviare un segnale ai processi che utilizzano un gruppo di file determinato, con l'opzione -k.
L'eseguibile fuser potrebbe trovarsi nella directory /usr/sbin/
, ma può essere utilizzato anche dagli utenti comuni per buona parte delle sue funzionalità.
Quando si utilizza Fuser per ottenere l'elenco dei processi che accedono a file determinati, i numeri di questi processi sono abbinati a una lettera che indica il modo in cui accedono:
L'eseguibile fuser restituisce il valore zero quando tra i file indicati come argomento ne esiste almeno uno che risulta utilizzato da un processo.
|
Segue la descrizione di alcuni esempi.
#
fuser *
[Invio]
Mostra i processi che accedono ai file della directory corrente.
#
fuser -k /usr/games/*
[Invio]
Elimina tutti i processi che utilizzano file nella directory /usr/games/
.
Uno script può utilizzare fuser nel modo seguente per verificare che un file non sia utilizzato da alcun processo prima di eseguire una qualche azione su di esso.
|
Lsof si utilizza con la sintassi seguente:
lsof [opzioni] [file]... |
Come si può vedere dal modello, con Lsof non è obbligatoria l'indicazione di un file o di una directory, perché in mancanza di queste informazioni, viene mostrato un elenco completo di file e directory aperte. Questa caratteristica di Lsof facilita la ricerca di file aperti all'interno di una certa posizione della gerarchia del file system (probabilmente scorrendo l'elenco dei file con l'aiuto di less), quando si cerca di eseguire il distacco di un disco e non si riesce perché un programma lo sta utilizzando.
Per approfondire l'uso di Lsof, si può leggere la pagina di manuale lsof(8).
Oltre alle informazioni dettagliate sui processi possono essere interessanti delle informazioni riassuntive dell'uso delle risorse di sistema. Si tratta principalmente dell'utilizzo della CPU e della memoria centrale.
È il caso di ricordare che nei sistemi operativi multiprogrammati la CPU esegue i vari processi elaborativi a turno, per piccoli intervalli di tempo, ma i processi possono trovarsi in attesa di poter ricevere input o di poter emettere output, al di fuori della competenza diretta della CPU, che quindi può rimanere inutilizzata, anche per la maggior parte del tempo di funzionamento. |
Per ottenere queste informazioni si usano in particolare uptime (7) e free. (8) Il primo permette di conoscere da quanto tempo è in funzione il sistema senza interruzioni e con quale carico medio, il secondo mostra l'utilizzo della memoria.
$
uptime
[Invio]
5:10pm up 2:21, 6 users, load average: 0.45, 0.48, 0.41 |
$
free
[Invio]
total used free shared buffers cached Mem: 22724 22340 384 13884 3664 5600 -/+ buffers: 13076 9648 Swap: 16628 6248 10380 |
uptime [opzioni] |
Emette una sola riga contenente:
l'orario attuale;
da quanto tempo è in funzione il sistema;
quante sessioni di lavoro sono aperte (viene indicato il numero di utenti che risultano collegati al sistema, ma può trattarsi anche dello stesso utente che si collega più volte);
il carico medio di sistema dell'ultimo minuto, degli ultimi cinque minuti e degli ultimi 15 minuti, in percentuale.
Di solito, il carico medio è l'informazione meno comprensibile di tutte le altre. Questo valore rappresenta la quantità media di processi attivi, in coda per l'esecuzione da parte del kernel. Per processi attivi, qui si intendono quelli che non sono in pausa per qualche ragione, come l'attesa del completamento di un'altra funzione. Pertanto, un valore inferiore a uno, indica che la coda dei processi del kernel è rimasta vuota durante parte del tempo preso in considerazione, mentre un valore superiore a uno indica un certo intasamento, che può diventare preoccupante quando l'unità di tempo presa in considerazione è quella più grande.
Il programma free emette attraverso lo standard output una serie di informazioni relative alla memoria reale e virtuale (swap).
free [opzioni] |
|
Alle volte può essere utile un controllo maggiore su ciò che fa un programma durante il suo funzionamento. Per questo viene in aiuto Strace, (9) che consente di avviare un altro comando e di controllarne le chiamate di sistema e l'uso dei segnali.
Strace si utilizza in pratica attraverso l'eseguibile strace, secondo il modello sintattico seguente:
strace [opzioni] comando [opzioni_del_comando] |
Le opzioni a disposizione dell'eseguibile strace sono numerose, ma qui vale la pena di indicarne solo una, -o, con la quale si specifica il file all'interno del quale inserire le informazioni ottenute durante il funzionamento del comando che viene avviato. Si osservi l'esempio seguente:
$
strace -o /tmp/ls.strace ls
[Invio]
Come si può intendere, si vuole vedere cosa succede avviando il programma ls senza argomenti. Il file /tmp/ls.strace
che si ottiene potrebbe essere simile all'estratto seguente:
|
Nell'estratto mostrato si vede solo l'inizio e la fine del file. In particolare, all'inizio si riconosce l'utilizzo di file all'interno della directory /etc/
; nella parte mancante si potrebbero notare anche i riferimenti alle librerie; infine, si vede il risultato emesso dal programma, costituito dall'elenco di file e directory, quindi la conclusione del programma stesso.
Strace può essere utile anche per chi non ha grande esperienza, per esempio per sapere dove un certo programma va a cercare certi file, o comunque per scoprire cosa c'è che impedisce il funzionamento di un programma.
Strace può essere usato anche per analizzare il funzionamento di un processo già attivo, con l'aiuto dell'opzione -p:
$
strace -p 12345
[Invio]
In questo caso, si vuole analizzare il funzionamento del processo elaborativo che ha il numero PID 12 345. Con l'opzione -e trace=read si può limitare l'attenzione alla lettura dei dati dai vari descrittori:
$
strace -p 12345 -e trace=read
[Invio]
In questo modo, si può vedere tutto ciò che viene letto dai vari descrittori del processo elaborativo numero 12 345.
Per poter leggere ciò che fa un altro processo elaborativo, Strace deve essere avviato con i privilegi necessari. Per esempio, se Strace funziona con i privilegi dell'utente Tizio, può leggere i processi che sono stati avviati dallo stesso utente (a meno che sia l'utente root che avvia qualcosa con privilegi di un utente comune). In alcuni sistemi, Strace viene installato con il bit SUID attivato e la proprietà all'utente root (SUID-root). In questo modo, se tutti gli utenti possono avviare il programma, chiunque può leggere ciò che fanno gli altri, anche quando si inseriscono dati riservati come una parola d'ordine.
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
2) Psmisc software libero con licenza speciale
3) Procps top GNU GPL
6) Lsof software libero con licenza speciale
7) Procps uptime GNU GPL
8) Procps free GNU GPL
9) Strace software libero con licenza speciale
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome situazione_dei_processi.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]