[>a259.html>] [<a257.html<] [^a2.html^]
Il problema della registrazione dell'utilizzo di risorse è nato proprio per misurare, e quindi per fare pagare, i servizi utilizzati dagli utenti. In questo senso si spiega l'enfasi «contabile» che si dà al problema.
Alla base della contabilità dell'utilizzo delle risorse del sistema sta il file /var/log/wtmp
, che deve esistere perché tali registrazioni avvengano effettivamente. Per motivi storici, non si tratta di un file di testo normale, e per leggerlo si usa generalmente il programma last, al quale si aggiungono eventualmente altri programmi più raffinati.
Oltre alla contabilità basata sul file /var/log/wtmp
si aggiunge quella legata ai processi, derivata da BSD (BSD Process Accounting). Mentre il file /var/log/wtmp
(e anche /var/run/utmp
) è gestito generalmente da Init, dalla procedura di accesso tradizionale (login), dalla serie dei programmi Getty, e da altri programmi che sono legati al sistema di autenticazione degli utenti, la contabilità dei processi in stile BSD è gestita direttamente dal kernel. Nel caso di GNU/Linux, si tratta di attivare l'opzione relativa nel gruppo denominato General setup.
BSD Process Accounting (21.2.4) Y
Come accennato, una delle caratteristiche importanti di questi file è il fatto di non essere file di testo normali. Il formato del loro contenuto varia da sistema a sistema, e anche da una versione all'altra dello stesso sistema operativo. Pertanto, può succedere alle volte che qualcosa non funzioni, nel senso che i programmi che vi accedono non riescono a interpretare i dati in modo corretto, o peggio eseguono delle registrazioni errate.
Questa annotazione serve per tenere in considerazione il problema, ma tutto quello che si può fare, quando si notano delle anomalie legate a queste componenti del sistema, è l'aggiornamento del software.
Il file /var/log/wtmp
è il registro storico degli accessi al sistema. Al suo interno vengono indicate le informazioni della data e dell'ora di accesso di ogni utente, assieme all'indicazione della provenienza degli accessi. I dati contenuti in questo file hanno valore solo se sono completi, nel senso che per ogni accesso si deve trovare anche la registrazione della conclusione della sessione di lavoro, altrimenti non possono essere calcolati i tempi di utilizzo.
Purtroppo, questo file non offre le garanzie di una base di dati vera e propria, e le registrazioni che vengono fatte al suo interno non sono mai sicure. Pertanto, i dati che si riescono a estrapolare sono da considerare approssimativi in generale.
Questo file tende a ingrandirsi rapidamente, tanto che periodicamente conviene fare pulizia. Di solito, le distribuzioni GNU/Linux provvedono a fornire degli script necessari per gestire in modo elegante, attraverso il sistema Cron, l'archiviazione e rotazione dei file delle registrazioni, compreso /var/log/wtmp
.
last [opzioni] [nome...]
Visualizza il contenuto del file delle registrazioni degli accessi (login) e disconnessioni (logout) per le informazioni riguardanti gli utenti e i terminali. Il file dal quale queste informazioni vengono attinte è /var/log/wtmp
. L'esempio seguente mostra una parte dell'output che potrebbe essere generato da questo programma.
daniele tty5 Tue Mar 30 16:18 still logged in daniele tty5 Tue Mar 30 16:17 - 16:18 (00:01) tizio ttyp1 roggen.brot.dg Tue Mar 30 14:33 still logged in reboot system boot Tue Mar 30 14:30 root tty3 Mon Mar 29 22:18 - down (01:29) daniele tty2 Mon Mar 29 21:29 - 23:47 (02:18) caio ttyp1 roggen.brot.dg Mon Mar 29 21:14 - 23:47 (02:33) reboot system boot Mon Mar 29 21:10
Si osserva in particolare che la prima voce rappresenta l'accesso più recente, quello dell'utente daniele dalla quinta console virtuale, che risulta essere ancora collegato. Si vede anche che lo stesso vale per l'utente tizio che sta utilizzando il sistema attraverso un accesso remoto proveniente dall'elaboratore roggen.brot.dg. Si notano anche gli accessi regolarmente conclusi (quelli che hanno un orario di inizio e un orario di fine, oltre che l'indicazione della durata dell'accesso tra parentesi), e quindi si distinguono gli accessi sicuramente conclusi, di cui non è stata annotata la fine. Infatti, il giorno 30 marzo alle ore ore 14.30 il sistema è stato riavviato, e di conseguenza gli accessi in essere in precedenza sono da considerare conclusi: l'accesso dell'utente root del 29 marzo alle ore 22.18 non è stato concluso in modo normale, probabilmente perché ha avviato il programma shutdown e non ha fatto in tempo a concludere la sessione di lavoro.
-numero | -n numero | --lines numero
Limita il numero di elementi visualizzati allo specifico valore numerico indicato.
-f file | --file file
Analizza il file specificato invece di utilizzare quello predefinito, cioè /var/log/wtmp
.
-x | --more-records
Permette di conoscere anche le informazioni sull'arresto del sistema e in generale sui cambiamenti del livello di esecuzione (runlevel).
$
last
Visualizza gli ultimi eventi del registro degli accessi.
$
last tizio root
Visualizza gli accessi e le disconnessioni da parte degli utenti tizio e root.
ac [opzioni] [utente...]
ac è un programma che si basa sul contenuto del file /var/log/wtmp
per determinare i tempi di accesso complessivi del periodo a cui si riferisce il file stesso.
Se viene utilizzato senza argomenti, si limita a emettere il tempo complessivo di tutti gli accessi, e in pratica è utile solo quando si indicano delle opzioni. Se viene indicato il nome di uno o più utenti, si ottengono soltanto i dati relativi a questi.
L'accuratezza delle informazioni ottenute con ac dipende naturalmente dall'integrità del file che viene analizzato.
-d | --daily-totals
Mostra l'elenco dei tempi di accesso giornalieri.
-p | --individual-totals
Mostra l'elenco dei tempi di accesso suddivisi per utente.
-f file | --file file
Analizza il file specificato invece di utilizzare quello predefinito, cioè /var/log/wtmp
.
$
ac
Mostra il totale degli accessi, per esempio ciò che appare di seguito, tenendo conto che il valore fa riferimento alle ore. Per la precisione si tratta di 4 198 ore e 51 minuti.
total 4198.85
$
ac -d
Mostra l'elenco dei tempi di accesso giornalieri, per esempio il listato seguente che viene mostrato solo nella sua parte finale.
... Mar 24 total 35.21 Mar 25 total 26.95 Mar 26 total 2.67 Mar 28 total 61.54 Mar 29 total 35.55 Today total 45.64
$
ac -p
Mostra l'elenco dei tempi di accesso suddivisi per utente.
pippo 1.84 ftp 0.99 tizio 2.93 daniele 3100.52 root 1083.21 semproni 6.41 caio 3.41 total 4199.32
$
ac -p tizio caio
Come nell'esempio precedente, ma limitatamente agli utenti tizio e caio.
tizio 2.93 caio 3.41 total 6.34
$
ac -p tizio caio -f /var/log/wtmp.1
Come nell'esempio precedente, ma analizzando il file /var/log/wtmp.1
che presumibilmente è il file delle registrazioni precedente.
Come già accennato all'inizio del capitolo, la contabilità riferita ai processi è gestita direttamente dal kernel. Questa viene attivata attraverso una chiamata di sistema, acct(), e per questo si usa un programma apposito: accton.
accton [file_delle_registrazioni]
Per la precisione, se accton viene usato senza argomenti, la contabilizzazione da parte del kernel viene disattivata; al contrario, se si indica il file da utilizzare, la contabilizzazione viene attivata e diretta verso quel file.
Il file in questione può essere /var/log/pacct
, o anche /var/account/pacct
. Nel secondo caso, si attiva la registrazione contabile dei processi con il comando seguente (naturalmente è necessario che il file esista già).
#
accton /var/account/pacct
Al contrario della contabilità legata al file /var/log/wtmp
, le informazioni riferite ai processi vengono considerate delle informazioni riservate, e per questo i permessi del file /var/account/pacct
dovrebbero impedire anche la lettura da parte degli utenti comuni.
Una gestione seria di questo sistema contabile richiede la sua attivazione e disattivazione attraverso la stessa procedura di inizializzazione del sistema. Semplificando molto le cose, lo script che attiva a disattiva la contabilità potrebbe essere fatto nel modo seguente:
#! /bin/sh test -x /usr/sbin/accton || exit 0 case "$1" in start) echo "Avvio della contabilità dei processi." /usr/sbin/accton /var/account/pacct 2>/dev/null ;; stop) echo "Arresto della contabilità dei processi." /usr/sbin/accton 2>/dev/null ;; *) echo "Utilizzo: acct {start|stop}" exit 1 esac exit 0
lastcomm [comando...] [utente...] [terminale...] [opzioni]
lastcomm è il programma fondamentale per la lettura del file della contabilità dei processi. Di per sé, per funzionare, non richiede i privilegi dell'utente root, però il file utilizzato per questa contabilità, /var/log/pacct
, è normalmente protetto contro qualunque accesso non privilegiato.
lastcomm può essere utilizzato senza argomenti, e in tal caso mostra tutte le informazioni contenute all'interno del file /var/log/pacct
, oppure può essere avviato con l'indicazione di comandi, utenti e terminali, in modo da limitare le informazioni che si vogliono estrarre da quel file.
Il listato tipico che si dovrebbe ottenere da questo programma è simile all'esempio seguente:
... cat tizio tty1 0.03 secs Tue Mar 30 07:38 ls tizio tty1 0.04 secs Tue Mar 30 07:38 clear tizio tty1 0.01 secs Tue Mar 30 07:38
--user nome_utente
Se l'indicazione del nome di un utente può essere ambigua, nel senso che potrebbe essere confuso con un comando, si può utilizzare questa opzione.
--command comando
Questa opzione permette di indicare un comando in modo da evitare ambiguità con i nomi degli utenti e dei terminali.
--tty terminale
Questa opzione permette di indicare un terminale (il nome del dispositivo senza il prefisso /dev/
) in modo da evitare ambiguità con i nomi degli utenti e dei comandi.
-f file_della_contabilità | --file file_della_contabilità
Se si desidera consultare un file diverso da quello predefinito, si può utilizzare questa opzione per specificarlo.
#
lastcomm tizio
Mostra la contabilità dei processi riferita all'utente tizio.
#
lastcomm --user tizio
Esattamente come nell'esempio precedente, ma con l'indicazione esplicita che tizio è inteso essere un utente.
sa [opzioni] [file_della_contabilità]
sa è un programma che genera delle statistiche dai dati contenuti nel file /var/account/pacct
, o in un altro che venga indicato come ultimo argomento della riga di comando. Oltre a questo, sa utilizza altri due file: /var/account/savacct
e /var/account/usracct
. Questi gli permettono di annotare le informazioni generate; nel primo caso riferite alla situazione complessiva, nel secondo distinte in base all'utente.
A seconda di come è stato compilato il sorgente del programma, alcune opzioni possono essere disponibili, o meno; inoltre, non è stabilito in modo univoco quale sia la collocazione esatta dei file utilizzati per questa contabilità. Per conoscere queste cose, basta avviare sa con l'opzione -h. In particolare, si potrebbe vedere il risultato seguente:
The system's default process accounting files are: raw process accounting data: /var/account/pacct summary by command name: /var/account/savacct summary by username: /var/account/usracct
In condizioni normali, quando sa viene avviato senza opzioni (o al massimo con l'indicazione del file contenente la contabilità), si ottiene un listato simile a quello seguente:
246 112.57re 1.38cp 24 8.60re 0.95cp ***other* 2 1.03re 0.19cp dpkg 5 5.08re 0.05cp troff 48 8.08re 0.03cp sh 2 0.43re 0.02cp rm 12 8.42re 0.02cp man 36 0.13re 0.02cp sa ...
La prima colonna rappresenta l'utilizzo in termini di chiamate di sistema, dove per esempio rm è stato avviato solo due volte; la seconda colonna, dove i valori sono seguiti dalla sigla re, indica il tempo reale di CPU; la terza colonna riporta la somma tra il tempo di sistema e quello utente dell'utilizzo della CPU; l'ultima colonna indica il nome del processo relativo.
Nel seguito vengono descritte solo alcune delle opzioni, dove in particolare sono state saltate quelle che possono aiutare a riordinare in modo differente i dati. Eventualmente, si può consultare la pagina di manuale sa(8).
-c |--percentages
Per ogni colonna di valori, ne aggiunge un'altra con le percentuali relative.
-m |--user-summary
Invece di generare un listato normale organizzato secondo i processi, genera un riassunto dell'utilizzo in base agli utenti proprietari dei processi.
-u |--print-users
Genera un elenco differente, composto dagli utenti, il tempo di CPU e il nome dei processi utilizzati dagli utenti stessi. Il risultato è un elenco molto più lungo del solito.