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 filesystem virtuale montato nella directory /proc/
. A questo proposito, è il caso di osservare che il pacchetto dei programmi di utilità che permettono di conoscere lo stato dei processi è denominato Procps, in riferimento a questa particolarità del kernel Linux.
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. |
fuser | Elenca i processi che utilizzano file determinati. |
uptime | Informa sul tempo di funzionamento e sul carico medio. |
free | Genera un rapporto stringato sull'uso della memoria. |
Il controllo dello stato dei processi esistenti avviene fondamentalmente attraverso l'uso di ps
, pstree
e top
. 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.
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
[Invio]-
u -
p
init(1)-+-crond(173) |-gpm(314) |-inetd(210) |-kerneld(23) |-kflushd(2) |-klogd(162) |-kswapd(3) |-login(374)---bash(382) |-login(381)---bash(404,daniele)---startx(415)---xinit(416)-... |-lpd(232) |-mingetty(380) |-mingetty(375) |-mingetty(376) |-mingetty(377) |-named(221) |-nfsiod(4) |-nfsiod(5) |-nfsiod(6) |-nfsiod(7) |-portmap(184) |-rpc.mountd(246) |-rpc.nfsd(255) |-rxvt(433)---bash(434,daniele)---su(444,root)---bash(445) |-rxvt(436)---bash(437,daniele)---pstree(608) |-sendmail(302) |-snmpd(198) |-syslogd(153) `-update(379) |
top
invece è un programma che impegna un terminale (o una finestra di terminale all'interno del sistema grafico) per mostrare il continuo aggiornamento della situazione. Si tratta quindi di un monitor continuo, con l'aggiunta però della possibilità di interferire con i processi inviandovi dei segnali o cambiandone il valore nice.
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 |
top
.
I programmi che visualizzano la situazione dei processi, utilizzano spesso delle sigle per identificare alcune caratteristiche. La tabella 19.2 ne descrive alcune.
Sigla | Descrizione |
UID | Il numero di UID e quindi l'utente proprietario del processo. |
PID | Il numero del processo, cioè il PID. |
PPID | Il 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 dell'immagine del processo in memoria (virtuale). |
RSS | La dimensione della memoria RAM utilizzata effettivamente. |
SWAP | La dimensione della memoria virtuale utilizzata. |
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
19.3.
Lettera | Stato |
R | In funzione (residente in memoria). |
S | In pausa o dormiente. |
D | In pausa non interrompibile. |
T | Sospeso. |
Z | Zombie. |
W | Non utilizza memoria (è spostato completamente nella memoria virtuale). |
N | Ha un valore nice positivo (rallentato). |
ps [<opzioni>] [pid... ] |
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. Dopo le opzioni possono essere indicati esplicitamente i processi (in forma dei numeri PID) in modo da ridurre a loro l'elenco ottenuto.
Le opzioni rappresentate da un singolo carattere 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.
---------
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 in modo semplificato, la dipendenza gerarchica tra i processi.
a |
Visualizza anche i processi appartenenti agli altri utenti.
r |
Emette l'elenco dei soli processi in esecuzione effettivamente, escludendo cioè 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 dispositivo corrispondente, /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[+| |
|
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
19.4.
-
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à. |
O
, oppure -
-
sort
di ps
.
$
ps
Elenca i processi appartenenti all'utente che dà il comando.
$
ps a l
Elenca tutti i processi utilizzando un formato più ampio in modo da fornire più dettagli sui processi.
$
ps a r
Elenca tutti i processi in funzione escludendo quelli in pausa.
$
ps a l OUr
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
Equivalente all'esempio precedente.
pstree [<opzioni>] [<PID> | <utente>] |
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. Di solito, quando da uno stesso genitore si diramano diversi processi con lo stesso nome, questi vengono raggruppati. Per cui:
init---4*[agetty] |
rappresenta un gruppo di quattro processi agetty
, tutti discendenti da init
.
|
Mostra tutta la riga di comando e non solo il nome del processo.
|
Disabilita l'aggregazione dei processi con lo stesso nome derivanti dallo stesso genitore.
|
Evidenzia il processo corrente e i suoi predecessori (antenati).
|
Visualizza senza troncare le righe troppo lunghe.
|
Mostra i PID.
|
Mostra la transizione degli UID, quando da un genitore appartenente a un certo utente, viene generato un processo che appartiene a un altro.
top [<opzioni>] |
Visualizza la situazione sull'utilizzo delle risorse di sistema attraverso una tabella dell'attività principale della CPU, cioè dei processi che l'impegnano maggiormente. Lo schema viene aggiornato a brevi intervalli, di conseguenza, impegna un terminale. Durante il suo funzionamento, top
accetta dei comandi espressi con un singolo carattere.
|
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 5 secondi.
|
Permette all'utente root
di richiedere un aggiornamento della tabella in modo continuo, senza intervalli di pausa.
|
Disabilita la possibilità di utilizzare alcuni comandi in modo interattivo. Può essere utile quando si vuole lasciare funzionare top
in un terminale separato e si vogliono evitare incidenti.
|
Permette di visualizzare anche i processi inattivi o zombie.
|
Permette di visualizzare la riga di comando, invece del solo nome del programma.
top
accetta una serie di comandi interattivi, espressi da un singolo carattere.
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 verrà indicato successivamente. Se il segnale non viene specificato, viene inviato SIGTERM
.
i |
Abilita o disabilita la visualizzazione dei processi inattivi e dei processi 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 funzione delle 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 determinato processo. Dopo l'inserimento della lettera r
, viene richiesto il 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 5 secondi.
f | F |
Permette di aggiungere o eliminare alcuni campi nella tabella dei processi.
A volte è importante conoscere se un file è utilizzato da qualche processo. Per questo si utilizza il programma fuser
che è in grado di dare qualche informazione aggiuntiva del modo in cui tale file viene utilizzato.
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 determinato gruppo di file, utilizzando l'opzione
.
-
k
fuser
si trova normalmente 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 in che modo accedono:
| |
| |
| |
| |
|
fuser
restituisce il valore zero quando tra i file indicati come argomento ne esiste almeno uno che risulta utilizzato da un processo.
|
Mostra tutti i file indicati nell'argomento, anche se non sono utilizzati da alcun processo. Normalmente, fuser
mostra solo i file in uso.
|
Invia un segnale ai processi. Se non viene specificato diversamente attraverso l'opzione
, si utilizza il segnale -
<segnale>SIGKILL
.
|
Permette di specificare il segnale da inviare con l'opzione
. In pratica, si tratta di un trattino seguito dal segnale espresso in forma numerica o in forma simbolica (per esempio -
k
).
-
TERM
|
Elenca i nomi di segnale conosciuti.
|
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 montata nel filesystem, 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.
|
Viene aggiunta l'indicazione dell'utente proprietario di ogni processo.
|
Mostra una tabellina dei processi abbinati ai file, in forma più chiara rispetto alla visualizzazione normale.
|
Disabilita qualunque emissione di informazioni. Viene utilizzato quando tutto ciò che conta è il solo valore restituito dal programma.
#
fuser *
Mostra i processi che accedono ai file della directory corrente.
#
fuser
-
k /usr/games/*
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.
#!/bin/bash MIO_FILE=./mio_file if fuser -s $MIO_FILE then echo "Il file $MIO_FILE è in uso"; else # esegue qualche azione sullo stesso ... fi |
Oltre alle informazioni dettagliate sui processi possono essere interessanti delle informazioni riassuntive dell'uso delle risorse di sistema. In particolare si usano uptime
e free
. Il primo permette di conoscere da quanto tempo è in funzione il sistema senza interruzioni, 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; | |
il carico medio di sistema dell'ultimo minuto, degli ultimi 5 minuti e degli ultimi 15 minuti. |
free [<opzioni>] |
free
emette attraverso lo standard output una serie di informazioni relative alla memoria reale e virtuale (swap).
|
I valori vengono espressi in byte.
|
I valori vengono espressi in Kbyte (è la modalità predefinita).
|
Visualizza anche una riga contenente i totali.
|
Disabilita il cosiddetto aggiustamento dei buffer. Normalmente, senza questa opzione, la memoria tampone, ovvero quella destinata ai buffer, viene considerata libera.
|
Permette di ottenere un aggiornamento continuo a intervalli regolari stabiliti dal numero di secondi indicato come argomento. Questo numero può essere anche decimale.
---------------------------
Appunti Linux 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ evo.it
[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]