[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


33. Orologio di sistema e calendario

L'orologio del sistema non serve solo a fornire l'indicazione della data e dell'ora corrente. Da esso dipende anche il buon funzionamento del sistema Cron e di conseguenza di tutto il sistema di pianificazione dei processi. La tabella 33.1 elenca i programmi e i file a cui si accenna in questo capitolo.

Nome Descrizione
date Legge o modifica l'informazione data-orario gestita dal kernel.
/etc/localtime File di configurazione dell'ora locale.
clock Legge o modifica l'informazione data-orario gestita dall'hardware.
hwclock Legge o modifica l'informazione data-orario gestita dall'hardware.
/etc/adjtime File di configurazione per l'aggiustamento dell'orologio hardware.
cal Calendario.

Tabella 33.1: Riepilogo dei programmi e dei file per la gestione della data e dell'ora del sistema.

33.1 Orario locale

Generalmente, quando si considera la differenza di orario tra un paese e un altro si pensa ai fusi orari. In questa ottica, per stabilire l'orario basterebbe conoscere il fuso orario in cui ci si trova. Tuttavia, l'utilizzo dell'ora estiva in molti paesi, in forme differenti a seconda di quanto stabilito dai vari governi, rende la determinazione dell'orario una cosa più complessa.

Per risolvere il problema si utilizza generalmente una sorta di base di dati contenente le regole con cui stabilire l'orario di ogni paese. A questo si abbina un orologio che mantiene un orario di riferimento, generalmente il tempo universale, dal quale il sistema è in grado di calcolare l'orario locale esatto.

Alcuni paesi utilizzano una notazione, generalmente di tre lettere, per indicare i vari fusi orari. Queste sigle non rappresentano uno standard per tutti, quindi vanno usate con prudenza. Il modo più sicuro per indicare un fuso orario è sempre quello di specificare il paese o una città particolare.

Alcune sigle sono particolarmente importanti, sia perché si usano spesso nella documentazione tecnica, sia perché appaiono nei messaggi dei programmi che si occupano di gestire l'orologio del sistema.

33.2 Distinzione tra hardware e software

Si distingue tra due orologi indipendenti: quello contenuto dell'hardware dell'elaboratore e quello gestito dal kernel del sistema. Per il sistema operativo, quello che conta è l'orario fornito dal kernel, ma l'orologio hardware è importante perché è in grado di funzionare anche quando l'elaboratore è spento. In pratica, all'avvio attraverso la procedura di inizializzazione del sistema, viene allineato l'orario del kernel con quello hardware.

33.2.1 Orologio hardware

L'orologio hardware è quello che appartiene alla parte fisica dell'elaboratore e normalmente è incorporato nella scheda madre. È alimentato attraverso una piccola batteria, in modo da poter funzionare anche quando l'elaboratore è spento.

Chi utilizza l'architettura i386 tende a chiamarlo «orologio del BIOS» oppure «orologio CMOS», dal momento che BIOS, CMOS e orologio sono cose che tendono a confondersi. Si tratta comunque, sempre della stessa cosa.

Utilizzando un elaboratore i386, il modo migliore per regolare questo orologio è quello di utilizzare le funzioni del programma di configurazione della memoria CMOS, residente normalmente nella ROM, e accessibile attraverso una combinazione di tasti al momento del test della memoria RAM.

È importante scegliere il tipo di orario su cui deve allinearsi l'orologio hardware. Generalmente, la scelta è tra la propria ora locale, o il tempo universale (UTC). Se non ci sono problemi di conflitti con altri sistemi operativi differenti da GNU/Linux, è importante che si utilizzi come riferimento il tempo universale. In questo modo, sarà il sistema operativo a occuparsi di calcolare la differenza in base al fuso orario e all'eventuale ora estiva.

33.2.2 Orologio del kernel e orario locale

L'orologio del kernel viene impostato all'avvio, in base a quanto indicato dall'orologio hardware. Successivamente, finché il sistema resta in funzione, non viene più interpellato l'orologio hardware (a meno che il proprio sistema non abbia una configurazione particolare per qualche motivo).

Il sistema deve quindi sapere se l'orologio hardware è impostato sull'orario locale o sul tempo universale, per stabilire in che modo deve essere allineato l'orologio del kernel. Dal punto di vista dell'utilizzatore, nel primo caso occorre intervenire manualmente sull'orologio hardware quando inizia o termina il periodo dell'ora estiva, nel secondo caso no.

Il kernel tiene traccia esclusivamente del tempo universale, attraverso un numero che rappresenta il tempo trascorso in secondi dall'ora zero del primo gennaio 1970. Per conoscere l'orario locale si utilizza un file di configurazione, `/etc/localtime', contenente le informazioni necessarie a calcolarlo.

33.3 Modifica dell'orario

Se l'orologio del sistema è errato (intendendo in questo anche la data), è il caso di intervenire attraverso diverse azioni possibili. Il modo più semplice, nel senso che comporta meno complicazioni, è il riavvio del sistema impostando correttamente l'orologio hardware, eventualmente tenendo presente se si deve utilizzare il tempo universale.

Se il sistema non può essere riavviato, si deve intervenire attraverso il programma `date', come verrà mostrato in seguito. Ma così facendo, dal momento che il sistema operativo è in funzione si provocano degli squilibri, sia nel sistema di pianificazione dei processi (Cron) che in alte situazioni (anche il sistema grafico X può risentirne). Il minimo che può capitare è di osservare un'intensa attività del sistema dovuta all'avvio di processi da parte del demone `cron'.

Tuttavia, quando si interviene sull'orologio di un sistema in funzione, bisogna accettare il rischio di dover riavviare il sistema, se ci si accorge che tutto è diventato instabile.

In alternativa alla modifica dell'orologio del sistema, si può agire sull'orologio hardware attraverso il programma `clock'. Così, al prossimo riavvio l'orario dovrebbe risultare corretto, senza infastidire l'attuale sessione di lavoro.

Quando si decide di modificare l'orario di sistema attraverso `date', dal momento che il peggio è fatto, conviene anche aggiornare l'orologio hardware attraverso `clock'.

33.4 Strumenti per la gestione dell'orologio

Attraverso il programma `date' si può leggere o impostare la data e l'ora del sistema. Dal momento che il kernel gestisce l'orologio con riferimento al tempo universale, è necessaria un'opportuna conversione che avviene per mezzo di quanto indicato nel file `/etc/localtime', che generalmente è un collegamento simbolico al file giusto, contenuto nella directory `/usr/share/zoneinfo/' (queste collocazioni sono definite in base alla gerarchia standard di GNU/Linux, a cui tutte le distribuzioni dovrebbero uniformarsi).

Il programma `clock' permette di leggere o impostare la data e l'ora dell'hardware. Utilizza il file `/etc/adjtime' per permettere un aggiustamento automatico del suo valore, quando si conosce esattamente di quanti secondi sbaglia ogni giorno.

33.4.1 # date

date [<opzioni>] [+<formato>] [<data>]

`date' permette di conoscere o di modificare la data e l'ora del sistema, cioè di quella gestita dal kernel. L'utente comune può utilizzare `date' solo per ottenere la data e l'ora attraverso lo standard output, mentre solo l'utente `root' può intervenire per modificarne il valore.

È importante tenere a mente che la modifica del valore contenuto nell'orologio del sistema può comportare instabilità.

La riga di comando di `date' si divide in tre parti principali: le opzioni, il formato di rappresentazione e la data. Il formato di rappresentazione è una stringa che descrive in che modo si vuole venga restituita la data o l'ora attuale. L'indicazione della data permette all'utente `root' di modificare la data e l'ora del sistema.

Alcune opzioni

-d <data> | --date=<data>

Emette la data e l'ora specificata attraverso l'argomento (composto da una stringa).

-s <data> | --set=<data>

Modifica la data del sistema, secondo quanto indicato nell'argomento stringa. La data e l'ora possono essere espressi nello stesso modo in cui si può fare con l'opzione `-d'.

-u | --universal

Emette o modifica la data riferita al tempo universale (UTC).

Formati

Se negli argomenti ne compare uno che inizia con un segno `+', questo viene interpretato come un formato di rappresentazione da utilizzare per emettere la data e l'ora. Si tratta di una stringa, dove tutti i caratteri vengono trattati per quello che sono, a eccezione delle direttive indicate nella tabella 33.2.

Direttiva Descrizione
%% Rappresenta un simbolo di percentuale singolo.
%n Rappresenta un codice di interruzione di riga.
%t Rappresenta una tabulazione orizzontale.
%s Numero di secondi trascorsi dall'epoca di riferimento (1997.01.01 00:00:00 UTC).
%c Data e ora corrispondente alla stringa `'%a %b %d %X %Z %Y''.
%H L'ora secondo il formato «00..23».
%I L'ora secondo il formato «01..12».
%k L'ora secondo il formato « 0..23».
%l L'ora secondo il formato « 0..12».
%M Minuti secondo il formato «00..59».
%S Secondi secondo il formato «00..59».
%p AM o PM.
%Z Sigla del fuso orario o nulla se non è determinabile.
%r Orario in dodici ore, secondo il formato «hh:mm:ss AM/PM».
%T Orario in ventiquattro ore, secondo il formato «hh:mm:ss».
%X Orario corrispondente alla stringa `'%H:%M:%S''.
%a Giorno della settimana abbreviato.
%A Giorno della settimana esteso.
%U Settimana dell'anno, utilizzando la domenica come primo giorno, «00..53».
%w Giorno della settimana, con lo zero corrispondente alla domenica, «0..6».
%b Mese abbreviato.
%h Come `%b'.
%B Mese per esteso.
%m Mese secondo il formato «01..12».
%y Le ultime due cifre dell'anno, «00..99».
%Y Anno per esteso.
%d Giorno del mese secondo il formato «01..31».
%j Giorno dell'anno secondo il formato «001..366».
%D Data secondo il formato «mm/gg/aa».
%x Rappresentazione locale della data in forma numerica.

Tabella 33.2: Direttive per la rappresentazione delle informazioni data-orario di `date'.

Quando non viene indicato un formato di rappresentazione della data, questa viene emessa secondo quanto si otterrebbe con la direttiva `%c'.

Data

Se viene indicato un argomento che non appartiene alle opzioni e non inizia con il segno `+', allora viene inteso trattarsi dell'indicazione di una data (ed eventualmente di un'ora) da utilizzare per modificare quella del sistema. La sintassi per indicare l'informazione data-orario, è la seguente:

<MMGGhhmm>[[<SS>]<AA>][.<ss>]

In pratica, si possono inserire otto cifre numeriche che rappresentano, rispettivamente a coppie: il mese, il giorno, le ore e i minuti. Di seguito si possono aggiungere altre due o quattro cifre che rappresentano l'anno («SS» sta per secolo). Infine, indipendentemente dal fatto che sia presente l'informazione dell'anno, possono essere aggiunte due cifre, separate da un punto, che rappresentano i secondi.

Esempi

date -d '2 months 5 days'

Restituisce la data corrispondente a due mesi e cinque giorni nel futuro.

date -d '1 month 3 hours ago'

Restituisce la data corrispondente a un mese e tre ore fa.

date '+%d/%m/%Y'

Emette la data nella forma giorno/mese/anno, con l'anno per esteso.

date 03151045

Modifica la data del sistema in modo che corrisponda al 15 marzo dell'anno in corso, alle ore 10:45.

date 03151045.10

Modifica la data del sistema in modo che corrisponda al 15 marzo dell'anno in corso, alle ore 10:45:10.

date 031510451998

Modifica la data del sistema in modo che corrisponda al 15 marzo 1998 alle ore 10:45.

33.4.2 # clock

clock [-u] [-r | -w | -s | -a]

`clock' permette di accedere all'orologio hardware dell'elaboratore.

Alcune opzioni

-u

Stabilisce che l'informazione data-orario contenuta nell'orologio hardware deve essere (oppure è) riferita al tempo universale (UTC).

-r

Legge la data e l'ora dell'orologio hardware e ne emette il contenuto attraverso lo standard output.

-w

Modifica la data e l'ora dell'orologio hardware, in base a quanto indicato dall'orologio di sistema. Quando il sistema fa affidamento sul fatto che l'orologio hardware contenga l'orario UTC, si utilizza questa opzione assieme a `-u'.

-s

Aggiorna la data e l'ora del sistema in base al contenuto dell'orologio hardware. Quando il sistema fa affidamento sul fatto che l'orologio hardware contenga l'orario UTC, si utilizza questa opzione assieme a `-u'.

-a

Aggiorna la data e l'ora del sistema in base al contenuto dell'orologio hardware, tenendo conto anche dell'errore sistematico indicato nel file `/etc/adjtime', e riaggiornando lo stesso orologio hardware.

Esempi

clock -r

Legge e restituisce la data e l'orario contenuto nell'orologio hardware.

clock -r -u

La stessa cosa dell'esempio precedente, ma visualizza la data e l'ora locale, essendo l'orologio impostato sul tempo universale.

clock -w -u

Aggiorna l'orologio hardware, con riferimento al tempo universale, secondo l'orologio del sistema.

clock -a -u

Aggiorna l'orologio di sistema a partire da quello hardware, tenendo conto che l'orologio hardware è riferito al tempo universale, e calcolando anche l'eventuale aggiustamento contenuto nel file `/etc/adjtime'.

33.4.3 # hwclock

hwclock [-<opzioni>]

`hwclock' è una versione alternativa del programma `clock' con il quale è compatibile. In particolare, accetta anche quasi tutte le opzioni di quel programma.

A differenza di `clock', `hwclock' è in grado di modificare direttamente l'orologio hardware, senza dover leggere l'orario fornito dal sistema operativo; inoltre, è in grado di gestire in modo autonomo il file di configurazione `/etc/adjtime' annotando l'errore dell'orologio hardware in base ai comandi di modifica dati dall'utente del sistema.

Alcune opzioni

-u | --utc

Stabilisce che l'informazione data-orario contenuta nell'orologio hardware deve essere (oppure è) riferita al tempo universale (UTC).

-r | --show

Legge la data e l'ora dell'orologio hardware e ne emette il contenuto attraverso lo standard output.

-w | --systohc

Modifica la data e l'ora dell'orologio hardware, in base a quanto indicato dall'orologio di sistema. Quando il sistema fa affidamento sul fatto che l'orologio hardware contenga l'orario UTC, si utilizza questa opzione assieme a `-u'.

-s | --hctosys

Aggiorna la data e l'ora del sistema in base al contenuto dell'orologio hardware. Quando il sistema fa affidamento sul fatto che l'orologio hardware contenga l'orario UTC, si utilizza questa opzione assieme a `-u'.

-a | --adjust

Aggiusta la data dell'orologio hardware in funzione del contenuto del file `/etc/adjtime'.

--set

Imposta l'orologio hardware in base all'indicazione data attraverso l'opzione `--date', e modifica di conseguenza anche il file `/etc/adjtime'.

--date=<data>

Definisce la data da attribuire all'orologio hardware. In pratica si usa solo assieme all'opzione `--set'.

Esempi

hwclock -r

Mostra la data e l'ora dell'orologio hardware.

hwclock -r -u

Mostra la data e l'ora dell'orologio hardware, tenendo conto che quella è riferita al tempo universale e correggendola di conseguenza prima di visualizzarla.

hwclock -u --set --date='04/01/1999 10:10:30'

Imposta l'orologio hardware al 1 aprile 1999, alle ore 10:10 e 30 secondi. Contestualmente, `hwclock' modifica il file `/etc/adjtime' annotando l'errore sistematico dell'orologio hardware in base alla differenza riscontrata rispetto all'orario precedente.

hwclock -a

Corregge la data dell'orologio hardware in funzione delle informazioni contenute del file `/etc/adjtime'.

hwclock -u -s

Aggiorna l'orologio del sistema in base al valore riportato dall'orologio hardware, che risulta posizionato sul tempo universale.

33.4.4 /etc/adjtime

Il file `/etc/adjtime' viene utilizzato da `clock' o da `hwclock' per tenere traccia dell'errore sistematico dell'orologio hardware. Contiene una sola riga di testo dove appaiono tre numeri, il cui significato è espresso dalla sintassi seguente:

[+|-]<aggiustamento-giornaliero> <ultimo-utilizzo> <resto>

Quando questo file non è configurato, appare la riga seguente:

0.0 0 0.0

Il primo valore rappresenta l'aggiustamento giornaliero in secondi che sarebbe necessario per fare sì che l'orologio hardware sia corretto. Per esempio, se vengono guadagnati sistematicamente cinque secondi ogni giorno, si può modificare il primo valore indicando `-5.0'.

Il secondo numero viene gestito dai programmi che si occupano di aggiustare l'orologio, e serve a memorizzare quando è stato fatto l'ultimo aggiustamento. Questo valore viene indicato con un numero che rappresenta quanti secondi sono trascorsi a partire dalla data di riferimento del sistema.

L'ultimo valore rappresenta la parte frazionaria di secondo che non ha potuto essere utilizzata nell'ultimo aggiustamento.

In pratica, l'amministratore del sistema deve occuparsi solo di modificare il primo valore, perché gli altri due sono gestiti direttamente dai programmi che si occupano di correggere l'orario. Eventualmente, utilizzano il programma `hwclock' con l'opzione `--set', non è nemmeno necessario preoccuparsi di questo.

Per fare in modo che l'orologio hardware venga corretto regolarmente attraverso le informazioni di questo file, è necessario che la procedura di inizializzazione del sistema sia stata predisposta in modo tale da provvedere ogni volta che viene avviato il sistema operativo. Di solito, le distribuzioni GNU/Linux sono già organizzate in questo modo; tuttavia potrebbe rimanere il problema di aggiornare l'orologio durante il funzionamento del sistema, in tutti i casi in cui l'elaboratore rimane acceso per tempi molto lunghi (si pensi a un nodo di Internet che offre dei servizi ininterrottamente). Evidentemente, occorre configurare il sistema Cron in modo da eseguire ogni giorno (a una certa ora) i comandi seguenti:

/sbin/clock -u -a
/sbin/clock -u -s

Oppure:

/sbin/hwclock -u -a
/sbin/hwclock -u -s

In pratica, prima si aggiorna l'orologio hardware e quindi si riallinea l'orologio del sistema operativo (negli esempi mostrati si presume che l'orologio hardware sia puntato sul tempo universale).

Il programma `clock' originale dovrebbe fare tutto utilizzando solo l'opzione `-a' (senza bisogno di essere riavviato con l'opzione `-s' per allineare il kernel). Tuttavia, se si tratta di un collegamento a `hwclock' che accetta la stessa opzione, l'aggiornamento dell'orologio del kernel deve essere richiesto in modo esplicito come è stato mostrato.

33.5 Calendario

Oltre ai problemi legati alla gestione dell'orologio interno del sitema, si può sentire l'esigenza di consultare un calendario, più o meno «perpetuo», che non sia limitato alla convenzione Unix per cui il tempo inizia il primo giorno del 1970. A questo proposito è bene tenere a mente il problema della riforma gregoriana. Da cal(1):

Si assume che la riforma gregoriana sia avvenuta il 3 settembre 1752. In quel momento, la maggior parte dei paesi ha riconosciuto la riforma (benché alcuni non l'abbiano riconosciuta fino agli inizi del 1900). Dieci giorni dopo tale data furono eliminati dalla riforma, così che il calendario per quel mese risulta un po' insolito.

33.5.1 $ cal

cal [<opzioni>] [<mese>] [<anno>]

`cal' serve a visualizzare un calendario molto semplice. Se non si indicano argomenti nella riga di comando, `cal' si limita a mostrare il mese attuale (in base alla data dell'orologio del sistema).

È possibile indicare un mese particolare, di un certo anno, oppure solo un anno. Il mese si indica con un numero da 1 a 12, mentre l'anno si indica con un numero da 1 a 9999. A questo proposito, è bene precisare che se si indica un numero soltanto, tra gli argomenti, questo viene inteso come l'anno, e non il mese.

`cal' è sensibile alla configurazione della localizzazione, attraverso la variabile di ambiente `LANG', oppure le variabili `LC_*' (si veda il capitolo 42). Così facendo, si ottengono i nomi delle settimane e dei mesi nella lingua prescelta.

Alcune opzioni

-j

Mostra la data giuliana; in pratica, si numerano i giorni a partire dall'inizio dell'anno, dove il primo giorno è il numero uno.

-m

Mostra il lunedì come il primo giorno della settimana.

Esempi

cal

Mostra il calendario del mese corrente.

cal -m

Come nell'esempio precedente, mettendo il lunedì all'inizio della settimana.

cal -m 1752

Mostra il calendario dell'anno 1752 (l'anno della riforma gregoriana).

cal -m 9 1752

Mostra il calendario di settembre 1752. Il risultato si può vedere dall'esempio seguente:

   settembre 1752
lu ma me gi ve sa do 
    1  2 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

---------------------------

Appunti Linux 2000.04.12 --- Copyright © 1997-2000 Daniele Giacomini --  daniele @ pluto.linux.it


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]