[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 93.   Situazione dei processi

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.

Tabella 93.1. Riepilogo dei programmi e dei file per conoscere la situazione dei processi in esecuzione.

Nome Descrizione
ps Elenca i processi in esecuzione.
pstree Elenca i processi in esecuzione in modo strutturato.
top Mostra l'utilizzo delle risorse da parte dei processi a intervalli regolari.
htop Come top, ma attraverso un'interfaccia interattiva più comoda.
pidof Elenca i numeri dei processi avviati con il nome indicato.
fuser Elenca i processi che utilizzano file determinati.
lsof Elenca i file aperti.
uptime Informa sul tempo di funzionamento e sul carico medio.
free Genera un rapporto stringato sull'uso della memoria.
strace Individua le chiamate di sistema e i segnali di un processo elaborativo.

93.1   Process status

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.

Figura 93.4. Il programma top.

 10:13pm  up 58 min,  5 users,  load average: 0.09, 0.03, 0.01
67 processes: 65 sleeping, 2 running, 0 zombie, 0 stopped
CPU states:  5.9% user,  0.7% system,  0.0% nice, 93.5% idle
Mem:   62296K av,  60752K used,   1544K free,  36856K shrd,  22024K buff
Swap: 104416K av,      8K used, 104408K free                 16656K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
  588 root      16   0  6520 6520  1368 R       0  5.1 10.4   0:02 X
  613 daniele    6   0   736  736   560 R       0  1.3  1.1   0:00 top
  596 daniele    1   0  1108 1108   872 S       0  0.1  1.7   0:00 fvwm2
    1 root       0   0   388  388   336 S       0  0.0  0.6   0:08 init
    2 root       0   0     0    0     0 SW      0  0.0  0.0   0:00 kflushd
    3 root       0   0     0    0     0 SW      0  0.0  0.0   0:00 kswapd
   82 root       0   0   352  352   300 S       0  0.0  0.5   0:00 kerneld
  139 root       0   0   448  448   364 S       0  0.0  0.7   0:00 syslogd
  148 root       0   0   432  432   320 S       0  0.0  0.6   0:00 klogd
  159 daemon     0   0   416  416   340 S       0  0.0  0.6   0:00 atd
  170 root       0   0   484  484   400 S       0  0.0  0.7   0:00 crond
  181 bin        0   0   336  336   268 S       0  0.0  0.5   0:00 portmap
  204 root       0   0   404  404   336 S       0  0.0  0.6   0:00 inetd

93.1.1   Intestazioni

I programmi che visualizzano la situazione dei processi, utilizzano spesso delle sigle per identificare alcune caratteristiche. La tabella 93.5 ne descrive alcune.

Tabella 93.5. Elenco di alcune delle sigle utilizzate dai programmi che permettono di consultare lo stato dei processi in esecuzione.

Sigla Descrizione
UID Il numero UID dell'utente proprietario del processo.
PID Il numero del processo, cioè il PID.
PPID Il numero PID del processo genitore (quello da cui ha avuto origine).
USER Il nome dell'utente proprietario del processo.
PRI La priorità del processo.
NI Il valore nice.
SIZE La dimensione complessiva dell'immagine del processo.
RSS La dimensione della porzione del processo residente effettivamente nella memoria centrale.
SWAP La dimensione della porzione del processo non residente nella memoria centrale (che pertanto si trova in una memoria di scambio o swap).
SHARE La quantità di memoria condivisa utilizzata dal processo.
WCHAN L'evento per cui il processo è in attesa.
STAT Lo stato del processo.
TT Il terminale, se il processo ne utilizza uno.
TIME Il tempo totale di utilizzo della CPU.
CTIME Il tempo di CPU sommando anche l'utilizzo da parte dei processi figli.
COMMAND Il comando utilizzato per avviare il processo.

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 93.6.

Tabella 93.6. Lo stato del processo espresso attraverso una o più lettere alfabetiche.

Lettera Stato
R
In funzione (residente in memoria).
S
In pausa o dormiente.
D
In pausa non interrompibile.
T
Sospeso.
Z
Defunto (zombie).
X
Morto.
W
Non utilizza la memoria centrale (pertanto è spostato completamente in una memoria di scambio).
N
Ha un valore nice positivo (in pratica è rallentato).

Tabella 93.7. L'indicazione dello stato del processo potrebbe essere accompagnato da altri simboli che aggiungono informazioni sullo stesso.

Simbolo Stato
<
Processo con un valore nice minore di zero.
N
Processo con un valore nice maggiore di zero.
L
Ha delle porzioni bloccate in memoria.
s
Processo principale di una sessione (di solito si tratta della shell con cui si avviano altri processi).
+
Processo in primo piano.

93.1.2   Utilizzo di «ps»

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.

Tabella 93.8. Elenco di alcune delle chiavi di ordinamento utilizzabili con l'opzione O, oppure --sort di ps.

Chiave Chiave Descrizione
c
cmd
Nome dell'eseguibile.
C
cmdline
Riga di comando completa.
o
session
Numero di sessione.
p
pid
PID.
P
ppid
PPID.
r
rss
RSS (memoria residente utilizzata).
t
tty
Terminale.
T
start_time
Orario di inizio del processo.
U
uid
UID.
u
user
Nominativo dell'utente
y
priority
Priorità.

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.

Tabella 93.9. Alcune opzioni.

Opzione Descrizione
l
Emette un elenco lungo, composto in sostanza da più elementi informativi.
u
Formato utente: viene indicato in particolare l'utente a cui appartiene ogni processo e l'ora di inizio in cui il processo è stato avviato.
f
Visualizza la dipendenza gerarchica tra i processi in modo semplificato.
a
Visualizza anche i processi appartenenti agli altri utenti.
r
Emette l'elenco dei soli processi in esecuzione effettivamente, escludendo così quelli che per qualunque motivo sono in uno stato di pausa.
h
Elimina l'intestazione dall'elenco. Può essere utile quando si vuole elaborare in qualche modo l'elenco.
tx
Permette di ottenere l'elenco dei processi associati al terminale x. Per identificare un terminale, si può utilizzare il nome del file di dispositivo corrispondente, senza il percorso precedente (/dev/), oppure la sigla ottenuta dal nome eliminando il prefisso tty.
e
Mostra l'ambiente particolare del processo dopo la riga di comando.
w
Se la riga è troppo lunga consente la visualizzazione di una riga in più: l'opzione può essere indicata più volte in modo da specificare quante righe aggiuntive possono essere utilizzate.
O[+|-]chiave[[+|-]chiave]...
--sort=[+|-]chiave\
  \[,[+|-]chiave]...
Permette di ottenere un risultato ordinato in base alle chiavi di ordinamento specificate. Le chiavi di ordinamento sono composte da una sola lettera nel caso si usi l'opzione O, mentre sono rappresentate da una parola nel caso dell'opzione --sort.
Il segno + (sottinteso) indica un ordinamento crescente, mentre il segno - indica un ordinamento decrescente. Le chiavi di ordinamento sono indicate simbolicamente in base all'elenco (parziale) visibile nella tabella 93.8.

Segue la descrizione di alcuni esempi.

93.1.3   Utilizzo di «pstree»

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]
     ...

Tabella 93.11. Alcune opzioni.

Opzione Descrizione
-a
Mostra tutta la riga di comando e non solo il nome del processo.
-c
Disabilita l'aggregazione dei processi con lo stesso nome derivanti dallo stesso genitore.
-h
Evidenzia il processo corrente e i suoi predecessori (antenati), se il terminale consente una qualche forma di evidenziazione.
-l
Visualizza senza troncare le righe troppo lunghe.
-p
Mostra i PID.
-u
Mostra la transizione degli UID, quando da un genitore appartenente a un certo utente, viene generato un processo che appartiene a un altro.

Segue la descrizione di alcuni esempi.

93.1.4   Utilizzo di «top»

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.

Tabella 93.15. Alcune opzioni.

Opzione Descrizione
-d secondi
Permette di specificare l'intervallo di tempo in secondi che viene lasciato trascorrere tra un aggiornamento e l'altro della tabella. Se non viene indicato questo argomento, l'intervallo di tempo tra gli aggiornamenti della tabella è di cinque secondi.
-q
Permette all'utente root di richiedere un aggiornamento della tabella in modo continuo, senza intervalli di pausa.
-s
Disabilita la possibilità di utilizzare alcuni comandi in modo interattivo. Può essere utile quando si vuole lasciare funzionare top in un terminale separato evitando incidenti.
-i
Permette di visualizzare anche i processi inattivi o defunti (zombie).
-c
Permette di visualizzare la riga di comando, invece del solo nome del programma.

Il programma top accetta una serie di comandi interattivi, espressi da un carattere singolo, che sono descritti nella tabella successiva.

Tabella 93.16. Alcuni comandi interattivi.

Comando interattivo Descrizione
h
?
La lettera h o il simbolo ? fanno apparire un breve riassunto dei comandi e lo stato delle modalità di funzionamento.
k
Permette di inviare un segnale a un processo che viene indicato successivamente. Se il segnale non viene specificato, viene inviato SIGTERM.
i
Abilita o disabilita la visualizzazione dei processi inattivi e dei processi defunti (zombie).
n
#
Cambia la quantità di processi da visualizzare. Il numero che esprime questa quantità viene richiesto successivamente. Il valore predefinito di questa quantità è zero, che corrisponde al numero massimo in base alle righe a disposizione sullo schermo (o sulla finestra) del terminale.
q
Termina l'esecuzione di top.
r
Permette di modificare il valore nice di un processo determinato. Dopo l'inserimento della lettera r, viene richiesto il numero PID del processo su cui agire e il valore nice. Un valore nice positivo peggiora le prestazioni di esecuzione di un processo, mentre un valore negativo, che però può essere attribuito solo dall'utente root, migliora le prestazioni. Se non viene specificato il valore nice, si intende 10.
S
Attiva o disattiva la modalità di visualizzazione cumulativa, con la quale, la statistica sull'utilizzo di risorse da parte di ogni processo, tiene conto anche di quello dei processi figli.
s
Cambia la durata, espressa in secondi, dell'intervallo tra un aggiornamento e l'altro dei valori visualizzati. L'utente root può attribuire il valore zero che implica un aggiornamento continuo. Il valore predefinito di questa durata è di cinque secondi.
f
F
Permette di aggiungere o eliminare alcuni campi nella tabella dei processi.

93.1.5   Utilizzo di «htop»

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]

  CPU[||                             1.3%]
  Mem[||||||||||||||||||||||||||263/438MB]
  Swp[|                         0/15123MB]

   PID USER      PR  NI  VIRT   RES   SHR S CPU% MEM% COMM
 3749 Debian-c  16   0  1872    68  1700 S  0.0  0.0 less -Pwless /var/log/syslo
 3790 Debian-c  16   0  1872    68  1700 S  0.0  0.0 less -Pwless /var/log/exim/
13319 root      15   0  6188  1800  5748 S  0.0  0.2 sshd: daniele@pts/140
12768 root      15   0  4848  1780  4028 S  0.0  0.2 SCREEN
13543 daniele   16   0  4656  1704  4264 S  0.0  0.2 /bin/sh
 3900 root      16   0  156M 62648  3072 S  0.0  5.8 /usr/bin/perl -w /usr/sbin/
11305 root      26  10  3712  1980  1624 S  0.0  0.2 /usr/sbin/mathopd -f /etc/m
 3591 root      16   0  1584   356  1416 S  0.0  0.0 /sbin/syslogd -rm 0
 3594 root      16   0  2728   180  1368 S  0.0  0.0 /sbin/klogd -c 3
 3905 root      16   0  1508    32  1356 S  0.0  0.0 /usr/sbin/kmsgsd
    1 root      16   0  1528    80  1376 S  0.0  0.0 init [2]
   32 root      15   0     0     0     0 S  0.0  0.0 kapmd
 3950 root      15   0  1796   268  1608 S  0.0  0.0 /usr/sbin/cron
32368 root      16   0  1516   136  1360 S  0.0  0.0 /usr/sbin/psadwatchd
12770 daniele   15   0 32184 28888  4932 S  0.0  2.7 mc
 3963 root      16   0    36    24    16 S  0.0  0.0 runsvdir /var/service log:
   36 root      15   0     0     0     0 S  0.0  0.0 kswapd0
    2 root      34  19     0     0     0 S  0.0  0.0 ksoftirqd/0
1Help   2Follow 3Search 4Invert 5Sort<- 6Sort-> 7Nice - 8Nice + 9Kill  10Quit

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.

Tabella 93.18. Comandi principali.

Tasto Descrizione
[Barra spaziatrice] Seleziona il processo che si trova sotto alla barra di scorrimento. Alcuni comandi possono operare su gruppi di processi; in quel caso si fa riferimento a quelli selezionati in questo modo.
[F1], [h] Mostra una guida riassuntiva dei comandi disponibili.
[F2] Fa in modo di mantenere in evidenza il processo su cui si trova la barra di scorrimento. Se la barra viene spostata, la richiesta viene annullata.
[F3], [/] Esegue una ricerca.
[F4] Inverte l'ordinamento.
[F5], [F6] Cambia il criterio di ordinamento in base alla colonna o a quella successiva. L'intestazione della colonna secondo cui è applicato l'ordinamento risulta evidenziata rispetto alle altre.
[F7], []],
[F8], [[]
Incrementa o decrementa la priorità di esecuzione del processo evidenziato dalla barra di scorrimento. Solo l'utente root può aumentare la priorità (ovvero può ridurre il valore nice).
[F9], [k] Invia un segnale ai processi selezionati, oppure a quello evidenziato dalla barra di selezione. Alla pressione del tasto segue un menù di segnali, tra cui scegliere quello desiderato.
[F10], [q] Termina il funzionamento del programma.
[M] Seleziona un ordinamento in base all'utilizzo della memoria.
[P] Seleziona un ordinamento in base all'utilizzo della CPU.
[C] Richiama la selezione delle colonne da visualizzare.

93.2   Determinazione del numero PID

Attraverso il programma pidof(5) è possibile determinare i numeri dei processi elaborativi PID corrispondenti al nome che viene fornito:

pidof [opzioni] programma...

Per esempio, per conoscere i numeri PID dei processi avviati con il nome named, si usa il comando seguente:

pidof named[Invio]

2707

Bisogna però considerare che non sempre si ottengono effettivamente tutti i numeri PID; nel caso dell'esempio mostrato la situazione reale potrebbe essere quella seguente:

pstree -p[Invio]

init(1)-+-...
       ...
        |-named(2707)-+-{named}(2708)
        |             |-{named}(2709)
        |             `-{named}(2710)
       ...

Si veda anche la pagina di manuale pidof(8).

93.3   Accesso ai file

A volte è importante conoscere se un file è utilizzato da qualche processo. Per questo si possono utilizzare i programmi Fuser(6) e Lsof,(7) che sono in grado di dare qualche informazione aggiuntiva del modo in cui tale file viene utilizzato.

93.3.1   Fuser

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:

Lettera Descrizione
c
directory corrente;
e
processo in esecuzione;
f
file aperto (spesso questa lettera non viene mostrata affatto);
F
file aperto in scrittura (spesso questa lettera non viene mostrata affatto);
r
directory radice;
m
file mappato in memoria o libreria condivisa.

L'eseguibile fuser restituisce il valore zero quando tra i file indicati come argomento ne esiste almeno uno che risulta utilizzato da un processo.

Tabella 93.22. Alcune opzioni.

Opzione Descrizione
-a
Mostra tutti i file indicati nell'argomento, anche se non sono utilizzati da alcun processo. Normalmente, fuser mostra solo i file in uso.
-k
Invia un segnale ai processi. Se non viene specificato diversamente attraverso l'opzione -segnale, si utilizza il segnale SIGKILL.
-segnale
Permette di specificare il segnale da inviare con l'opzione -k. In pratica, si tratta di un trattino seguito dal segnale espresso in forma numerica o in forma simbolica (per esempio -TERM).
-l
Elenca i nomi dei segnali conosciuti.
-m
Utilizzando questa opzione può essere indicato solo un nome di file, il quale può essere un file di dispositivo, riferito a un'unità di memorizzazione innestata nel file system, o una directory che costituisce il punto di innesto della stessa. Quello che si ottiene è l'indicazione di tutti i processi che accedono a quella unità di memorizzazione.
-u
Viene aggiunta l'indicazione dell'utente proprietario di ogni processo.
-v
Mostra una tabellina dei processi abbinati ai file, in forma più chiara rispetto alla visualizzazione normale.
-s
Disabilita qualunque emissione di informazioni. Viene utilizzato quando tutto ciò che conta è il solo valore restituito dal programma.

Segue la descrizione di alcuni esempi.

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.

#!/bin/sh
#
MIO_FILE=./mio_file
#
if fuser -s $MIO_FILE
then
    echo "Il file $MIO_FILE è in uso";
else
    #
    # Esegue qualche azione sullo stesso.
    #
    ...
fi

93.3.2   Lsof

Lsof serve a elencare i file aperti e 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.

Segue la descrizione di alcuni esempi.

Per approfondire l'uso di Lsof, si può leggere la pagina di manuale lsof(8).

93.4   Informazioni riepilogative

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(8) e free.(9) 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

93.4.1   Utilizzo di «uptime»

uptime [opzioni]

Emette una sola riga contenente:

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.

93.4.2   Utilizzo di «free»

Il programma free emette attraverso lo standard output una serie di informazioni relative alla memoria reale e virtuale (swap).

free [opzioni]

Tabella 93.26. Alcune opzioni.

Opzione Descrizione
-b
I valori vengono espressi in byte.
-k
I valori vengono espressi in kibibyte (simbolo: «Kibyte») e si tratta della modalità predefinita.
-t
Visualizza anche una riga contenente i totali.
-o
Disabilita il cosiddetto aggiustamento dei buffer. Normalmente, senza questa opzione, la memoria tampone, ovvero quella destinata ai buffer, viene considerata libera.
-s secondi
Permette di ottenere un aggiornamento continuo a intervalli regolari stabiliti dal numero di secondi indicato come argomento. Questo numero può essere anche decimale.

93.5   Controllo diagnostico

Alle volte può essere utile un controllo maggiore su ciò che fa un programma durante il suo funzionamento. Per questo viene in aiuto Strace,(10) 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 uno dei due modelli sintattici seguenti:

strace [opzioni] comando [opzioni_del_comando]
strace [opzioni] -p pid_da_controllare

Le opzioni a disposizione dell'eseguibile strace sono numerose, ma la più importante da ricordare è -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:

execve("/bin/ls", ["ls"], [/* 15 vars */]) = 0
uname({sys="Linux", node="dinkel", ...}) = 0
brk(0)                                  = 0x8058a88
open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
...
write(1, "bin   dos   lib\t\tnano-hdb1.tar.g"..., 56) = 56
write(1, "boot  etc   lost+found\topt\t\t  sb"..., 52) = 52
write(1, "dev   home  mnt\t\tproc\t\t  SKELETO"..., 52) = 52
munmap(0x40012000, 4096)                = 0
exit_group(0)                           = ?

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.

Strace può anche seguire i processi figli di un certo processo, utilizzando le opzioni -f e -F:

strace -f -F -p 12345[Invio]

Con questo esempio, viene seguito il processo elaborativo numero 12 345 e quelli che lui stesso avvia.

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.

Tabella 93.28. Alcune opzioni per l'uso di Strace.

Opzione Descrizione
-f -F
-fF
Segue anche i processi figli.
-p pid
Segue il processo elaborativo indicato attraverso il suo numero PID.
-o file
Salva il risultato dell'analisi nel file indicato.
-e trace=chiamata
Tiene sotto controllo specificatamente la chiamata di sistema indicata.
-e trace=open,close,read,write
Tiene sotto controllo le chiamate di sistema principali per l'accesso ai file.
-e trace=file
Tiene sotto controllo tutte le chiamate di sistema che hanno per argomento il nome di un file.

Come esempio pratico in cui diventa molto importante l'uso di Strace si può considerare un programma che offre un servizio di rete, sotto il controllo di Inetd, che non funziona perché non trova un file (quindi si presume che fallisca la funzione open()), ma non si sa di quale file si tratti. In questo caso, non è possibile conoscere il numero PID del processo elaborativo, perché viene avviato di volta in volta da Inetd, pertanto occorre avvalersi della coppia di opzioni -f e -F:

strace -f -F -e open -p $(pidof inetd)[Invio]

Per semplificare il lavoro, si lascia al programma pidof il compito di determinare il numero PID del processo corrispondente a Inetd.


1) Procps ps   GNU LGPL

2) Psmisc   software libero con licenza speciale

3) Procps top   GNU GPL

4) Htop   GNU GPL

5) System V Init   GNU GPL

6) Psmisc   GNU GPL

7) Lsof   software libero con licenza speciale

8) Procps uptime   GNU GPL

9) Procps free   GNU GPL

10) Strace   software libero con licenza speciale


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome situazione_dei_processi.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory