15.3. Comandi per ora/data

Ora/data e calcolo del tempo

date

La semplice invocazione di date visualizza la data e l'ora allo stdout. L'interesse per questo comando deriva dall'uso delle sue opzioni di formato e verifica.

Esempio 15-10. Utilizzo di date

#!/bin/bash
# Esercitarsi con il comando 'date'

echo "Il numero di giorni trascorsi dall'inizio dell'anno è `date +%j`."
# È necessario il '+' per il formato dell'output.
# %j fornisce i giorni dall'inizio dell'anno.

echo "Il numero di secondi trascorsi dal 01/01/1970 è `date +%s`."
#  %s contiene il numero di secondi dall'inizio della "UNIX epoch", ma 
#+ quanto può essere utile?

prefisso=temp
suffisso=$(date +%s)  # L'opzione "+%s" di 'date' è una specifica GNU.
nomefile=$prefisso.$suffisso
echo $nomefile
#  È importantissima per creare nomi di file temporanei "univoci", è persino 
#+ migliore dell'uso di $$.

# Leggete la pagina di manuale di 'date' per le altre opzioni di formato.

exit 0

L'opzione -u fornisce il tempo UTC (Universal Coordinated Time).

bash$ date
dom mag 11 17:55:55 CEST 2003



bash$ date -u
dom mag 11 15:56:08 UTC 2003
	      

Il comando date possiede un certo numero di opzioni. Per esempio %N visualizza la parte di nanosecondi dell'ora corrente. Un uso interessante è quello per generare interi casuali di sei cifre.

date +%N | sed -e 's/000$//' -e 's/^0//'
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Toglie gli zeri iniziali e finali, se presenti.

Esistono molte altre opzioni (eseguite man date).

date +%j
# Visualizza i giorni dell'anno (i giorni trascorsi dal 1 gennaio).

date +%k%M
# Visualizza l'ora e i minuti nel formato 24-ore, come unica stringa di cifre.


#  Il parametro 'TZ' consente di ottenere il tempo di una zona diversa da 
#+ quella di default.
date                 # Mon Mar 28 21:42:16 MST 2005
TZ=EST date          # Mon Mar 28 23:42:16 EST 2005
# Grazie a Frank Kannemann e Pete Sjoberg, per il suggerimento.


SeiGiorniFa=$(date --date='6 days ago')
UnMeseFa=$(date --date='1 month ago')  # Quattro settimane (non un mese).
UnAnnoFa=$(date --date='1 year ago')

Vedi anche Esempio 3-4.

zdump

Controllo dell'ora di zona: visualizza l'ora di una zona specificata.

bash$ zdump EST
EST  Sun May 11 11:01:53 2003 EST
	      

time

Fornisce statistiche molto dettagliate sul tempo di esecuzione di un comando.

time ls -l / visualizza qualcosa di simile:

0.00user 0.01system 0:00.05elapsed 16%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (149major+27minor)pagefaults 0swaps

Si veda anche il comando, molto simile, times nella sezione precedente.

Nota

Dalla versione 2.0 di Bash, time è diventata una parola riservata di shell, con un comportamento leggermente diverso se usato con una pipe.

touch

Utility per aggiornare all'ora corrente di sistema, o ad altra ora specificata, l'ora di accesso/modifica di un file. Viene usata anche per creare un nuovo file. Il comando touch zzz crea un nuovo file vuoto, di nome zzz, nell'ipotesi che zzz non sia già esistente. Creare file vuoti, che riportano l'ora e la data della loro creazione, può rappresentare un utile sistema per la registrazione del tempo, per esempio per tener traccia delle successive modifiche di un progetto.

Nota

Il comando touch equivale a : >> nuovofile o a >> nuovofile (per i file regolari).

Suggerimento

Prima dell'esecuzione di cp -u (copy/update), si dovrebbe usare touch per aggiornare data/ora dei file che non si vuole siano sovrascritti.

Ad esempio, se la directory /home/bozo/tax_audit contenesse i file spreadsheet-051606.data, spreadsheet-051706.data e spreadsheet-051806.data, allora l'esecuzione di touch spreadsheet*.data proteggerebbe questi file dall'essere sovrascritti da file aventi lo stesso nome durante l'esecuzione di cp -u /home/bozo/financial_info/spreadsheet*data /home/bozo/tax_audit.

at

Il comando di controllo di job at esegue una data serie di comandi ad un'ora determinata. Ad uno sguardo superficiale, assomiglia a cron. Tuttavia, at viene utilizzato principalmente per eseguire la serie di comandi una sola volta.

at 2pm January 15 visualizza un prompt per l'inserimento della serie di comandi da eseguire a quella data e ora. I comandi dovrebbero essere shell-script compatibili poiché, per questioni pratiche, l'utente sta digitando una riga alla volta in uno script di shell eseguibile. L'input deve terminare con un Ctl-D.

Con l'uso dell'opzione -f o della redirezione dell'input (<), at può leggere l'elenco dei comandi da un file. Questo file è uno script di shell eseguibile e, naturalmente, non dovrebbe essere interattivo. Risulta particolarmente intelligente inserire il comando run-parts nel file per eseguire una diversa serie di script.

bash$ at 2:30 am Friday < at-elenco-job
job 2 at 2000-10-27 02:30
	      

batch

Il comando di controllo di job batch è simile ad at, ma esegue l'elenco dei comandi quando il carico di sistema cade sotto 0.8. Come at, può leggere, con l'opzione -f, i comandi da un file.

cal

Visualizza allo stdout un calendario mensile in un formato molto elegante. Può fare riferimento all'anno corrente o ad un ampio intervallo di anni passati e futuri.

sleep

È l'equivalente shell di un ciclo wait. Sospende l'esecuzione per il numero di secondi indicato. È utile per la temporizzazione o per i processi in esecuzione in background che hanno il compito di verificare in continuazione il verificarsi di uno specifico evento (polling), come in Esempio 29-6.

sleep 3     # Pausa di 3 secondi.

Nota

Il comando sleep conta, in modo predefinito, i secondi. Possono però essere specificati minuti, ore o giorni.

sleep 3 h    # Pausa di 3 ore!

Nota

Per l'esecuzione di comandi da effettuarsi ad intervalli determinati, il comando watch può rivelarsi una scelta migliore di sleep.

usleep

Microsleep (la u deve interpretarsi come la lettera dell'alfabeto greco mu, usata come prefisso per micro). È uguale a sleep, visto prima, ma "sospende" per intervalli di microsecondi. Può essere impiegato per una temporizzazione più accurata o per la verifica, ad intervalli di frequenza elevati, di un processo in esecuzione.

usleep 30     # Pausa di 30 microsecondi.

Questo comando fa parte del pacchetto Red Hat initscripts / rc-scripts.

Attenzione

Il comando usleep non esegue una temporizzazione particolarmente precisa e, quindi, non può essere impiegato per calcolare il tempo di cicli critici.

hwclock, clock

Il comando hwclock dà accesso e permette di regolare l'orologio hardware della macchina. Alcune opzioni richiedono i privilegi di root. Il file di avvio /etc/rc.d/rc.sysinit usa hwclock per impostare, in fase di boot, l'ora di sistema dall'orologio hardware.

Il comando clock è il sinonimo di hwclock.