Resume
Supponete di dover scaricare un grosso file, ad es. un grosso rpm o tar.gz
o un grosso mp3 e che, per qualche ragione, un download si interrompa. Se
il server FTP o HTTP supporta il resume, potete continuare dal punto in
cui eravate interrotti tramite l'opzione -c
Es. per sperimentare la cosa, copiate un grosso file nella directory FTP
(/home/ftproot in xitami), ad es. la versione pdf di Appunti di Linux:
$ wget ftp://localhost/pub/AL-2000.04.12.pdf.tar.gz
(nota: in mancanza di uno username e di una password, wget passa di
default anonymous e il vostro indirizzo di e-mail; per specificare invece
i dati dell'autenticazione nell'url, la sintassi è:
ftp|http://user:password@host/path)
Premete CTRL-C prima che il download si interrompa. Poi osservate come
avviene il resume tramite il comando FTP REST:
$ wget -c ftp://localhost/pub/AL-2000.04.12.pdf.tar.gz
(nota: senza l'opzione -c, invece di continuare il download dal punto in
cui era stato interrotto, wget lo reinizierebbe daccapo, salvandolo col
nome AL-2000.04.12.pdf.tar.gz.1)
Non tutti i server HTTP supportano il resume (che si ottiene tramite
l'header `Range' nella richiesta mandata dal client), mentre la maggior
parte dei server FTP sì.
Specchio, specchio delle mie brame...
Un mirror (letteralmente specchio) è una copia di un intero sito web o ftp
(più o meno aggiornata). Ad es. www.tucows.com è un famoso software
repository che ha mirror in tutto il mondo. Di solito la cosa migliore
prima di mirrorarsi un sito è accordarsi con il suo amministratore, anche
per segnalare che il mirror esiste (molti server mantengono una lista dei
propri mirror che è il principale modo che un visitatore casuale ha per
giungere al vostro mirror), oltre che per una questione di gentilezza.
Chiedete ad es. quanto spazio occorre per fare il mirror e se potete
aggiungere nella homepage il vostro logo o qualcosa per farvi pubblicità e
quali sono gli orari in cui il sistema remoto ha meno carico (e in cui vi
conviene fare il mirror) ecc... Il vantaggio dei mirror è che un
visitatore potrebbe essere meglio collegato con un mirror anzichè con un
altro. In realtà probabilmente sono pochi i visitatori che, prima di
scaricare grossi file si mettono a pingare i vari mirror o fanno delle
prove per stabilire da dove si scarica più velocemente (anche se i più
esperti a volte lo fanno). Nonostante ciò la presenza dei mirror
diminuisce certamente il carico del server principale, poichè molti
visitatori potrebbero capitare sul vostro mirror tramite link o motore di
ricerca. Se vi impegnate a mirrorare qualcosa, oltre che ovviamente
chiedere il permesso, cercate anche di mantenere aggiornato il vostro
mirror, altrimenti molti visitatori lo scanseranno. Non è bello propinare
ai visitare dei contenuti non aggiornati, specialmente se non c'è un link
esplicito al sito principale che indichi che quella è la risorsa più
aggiornata. Vedremo ora come wget e cron vi aiutano a mantenere un buon
mirror con poca fatica.
Vediamo dapprima delle altre opzioni di wget che aiutano nella gestione
dei mirror. Poi tratteremo del demone cron.
-N, --timestamping don't retrieve files if older than local.
Questa è l'opzione di timestamping: con -N wget scaricherà solo quei file
che sono cambiati dall'ultimo download con evidente risparmio di banda. Da
notare che l'ora con cui vengono salvati i file scaricati da wget è la
stessa che hanno sul server remoto (se il server fornisce l'header
`Last-Modified' nell'intestazione HTTP). Per maggiori dettagli sul
funzionamento di -N fare:
$ info wget time-stamping
-nc, --no-clobber don't clobber existing files.
L'opzione -nc invece fa sì che un file già esistente non venga più
richiesto, quindi non venga sovrascritto. Se il file in questione cambia
sul server, la nuova versione non viene scaricata. Tuttavia il file locale
viene analizzato se -nc viene usata in combinazione con l'opzione -r.
Questa opzione è meno utile di -N e perciò usata molto meno. Di solito
serve quando ripetete un certo download con nuove opzioni che portano a
scaricare più file che nel caso precedente (ad es. eliminate l'opzione
-np). La differenza rispetto ad -N è anche ovviamente che -nc non
interroga il server remoto per sapere la data di ultima modifica dei file
già esistenti in locale.
-w, --wait=SECONDS wait SECONDS between retrievals.
Questa è davvero una opzione di gentilezza: potete evitare di
sovraccaricare il server remoto facendo attendere wget un certo numero di
secondi specificato tra una richiesta e l'altra al server. Se volete
attendere dei minuti specificatene il numero seguito da m (analogamente h
sta per hour e d per day).
-t, --tries=NUMBER set number of retries to NUMBER (0 unlimits).
Questa imposta il numero massimo di volte in cui wget deve tentare di
scaricare un file prima di rinunciare. Notare che se invece un file non
esiste e il server non è giù, wget riceve un messaggio di errore dal
server e quindi non ritenta. Questa opzione e la precedente (-w) sono
utili per far sì che, nel caso di problemi sulla rete o nel caso in cui
l'host remoto è giù o comunque nel caso in cui la connessione cada per
qualsiasi motivo prima di aver finito il download di un file, wget aspetti
un tempo sufficientemente lungo affinchè il problema venga risolto prima
di ritentare. Se NUMBER è 0 o inf wget ritenterà infinite volte, ogni
volta aspettando un tempo specificato tramite -w. Il valore predefinito
per NUMBER è 20.
-b, --background go to background after startup.
Insieme col comando nohup abbiamo già discusso l'utilità di questa opzione.
-m, --mirror turn on options suitable for mirroring.
Questa opzione ne attiva alcune altre di uso comune quando si vuole fare
un mirroring. Precisamente equivale a `-r -N -l inf -nr', che abilita la
ricorsione e la funzionalità di time-stamping, imposta all'infinito la
profondità di ricorsione e (opzione -nr alias --dont-remove-listing) non
rimuove i file temporanei .listing generati dalle richieste di FTP. Per
maggiori informazioni al riguardo:
$ info wget Invoking "Recursive Retrieval Options"
Es.
$ nohup wget -m -t0 -b http://www.peanuts.com
cron: il demone del tempo
Di seguito descriverò l'utilizzo del demone cron, con particolare
riferimento ad una certa versione per Linux (che è quella distribuita con
Linux Peanut), scritta da Matthew Dillon.
Il demone cron (detto anche crond) agisce in background. Il suo scopo
è di analizzare un file in formato crontab di un utente ed eseguire
ad un istante specificato dei comandi, proprio come se fosse l'utente
in questione ad eseguirli.
Il programma crontab viene usato per comunicare con il demone cron: esso
permette di modificare con facilità un file di tipo crontab e comunica
al demone l'avvenuta modifica.
Di solito i file crontab risiedono nella directory
/var/spool/cron/crontabs. Ogni file ha un nome che corrisponde a quello
dell'utente con i cui i comandi temporizzati vengono eseguiti.
In questa implementazione di crond per Linux di Dillon, solamente il
superuser (cioè il root) può manipolare il crontab per un determinato
utente, quindi se non avete accesso come root, dovrete chiedere al root (o
alla root nel caso fosse una bella ragazza ;) di inserire il file nella
directory succitata.
Se avete accesso di root: se crond non è attivato, attivatelo
semplicemente digitando crond. man crond per saperne di più. Nota: come
fate a sapere se crond è attivato o meno? Semplice: molte distribuzioni
visualizzano un messaggio se lo attivano all'avvio del tipo "Starting cron
daemon: crond". Comunque, per verificare se crond è residente, basta dare
questo comando:
$ ps -A | grep crond
44 ? 00:00:00 crond
in questo caso crond è attivato. Se invece l'output è niente, allora crond
non è attivato. Un modo più sofisticato di attivare crond è questo:
# /usr/sbin/crond -l8 >>/var/adm/cron 2>&1
Questo comando indica di loggare tutta l'attività di crond nel file
/var/adm/cron. Precisamente tutti i messaggi sullo stdout e sullo stderr
di crond vengono aggiunti al file /var/adm/cron. Potete vederlo in tempo
reale, se riservate una console a mostrare le modifiche del file
/var/adm/cron, cosa ottenibile col comando:
$ tail -f /var/adm/cron
Nel file /var/adm/cron verranno aggiunte linee del tipo:
26-Aug-2000 22:47 /usr/sbin/crond 2.3.3 dillon, started
26-Aug-2000 22:49 USER root pid 148 cmd date
Queste significano che il 26-Aug-2000 22:47 crond è stato attivato e due
minuti dopo, crond ha eseguito per il root il comando date (vedi esempio
in seguito).
Come fare per far sì che crond sia avviato automaticamente all'avvio se
non lo è già? In Unix, il kernel, che è il principale componente del
sistema operativo ed è anche il primo a caricarsi, dopo che si è caricato
avvia un programma detto Init che a sua volta avvia molti altri processi
utili richiamandosi degli script che sono localizzati in /etc/rc.d. Il
comando di invocazione di crond va inserito in uno di questi script, a
seconda del runlevel scelto (che è indicato nel file /etc/inittab) e di
come la vostra distribuzione organizza gli script dentro /etc/rc.d,
per cui vi rimando alla documentazione del vostro sistema.
Il comando:
# crontab -e [user]
permette di editare un file di crontab. L'utente di default è root.
crontab si richiama l'editor specificato nella variabile di ambiente
EDITOR. Per essere sicuri di usare pico (un editor particolarmente facile
da usare, indicato quindi per tutti i root principianti :), date il
comando EDITOR=pico prima di chiamare crontab. Se il file crontab non
esiste, lo crea in /var/spool/cron/crontabs/user (notare che il file
ha il nome corrispondente al vostro nome utente).
Se invece mandate il vostro file di crontab al root, esso lo può sostituire
al vostro file semplicemente con il comando
# crontab path_nuovo_crontab_di_user -u user
Ad es. se l'utente ant dice all'affascinante root di attivare la nuova
versione del suo file di crontab, ella lo può attivare al posto del
vecchio file di ant facendo (supponendo che il nuovo file sia /home/ant):
# crontab /home/ant -u ant
Con un comando analogo, il root può decidere di cancellare il crontab
che contiene tutti i comandi eseguiti sotto l'utente ant, ad es. perchè
l'utente ant non è stato gentile con lei:
# crontab -d ant
Mentre per vedere il suo crontab (o meglio "il crontab dei comandi
eseguiti sotto l'utente root") farà:
# crontab -l
Per vedere quello dell'utente ant (se c'è) farà:
# crontab -l ant
Richiamando crontab senza argomenti o in modo non valido, viene ricordata
la sintassi della chiamata.
# crontab
Il formato crontab è molto semplice. Per saperne di più, man crontab.
Occorre specificare su una riga sei campi, in questo ordine.
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
Le righe vuote o inizianti con # sono ignorate. Un campo può contenere il
valore temporale corrispondente (es. 10 per HOUR sta per ore 10 a.m.), un
intervallo di tempo specificato usando due valori temporali separati da un
trattino (es. 10-12 per HOUR sta per ore 10 a.m., ore 11 a.m., ore 12
a.m.), un intervallo seguito da un fattore di skip (es. 10-14/2 sta per
ore 10 a.m, ore 12 a.m., ore 14 a.m) (notare che il fattore di skip per
default è 1), un intervallo simbolico per il giorno della settimana e il
mese (es. mon-fri sta per lunedi, martedi, mercoledi, giovedi, venerdi,
ossia per tutti i giorni lavorativi), oppure più sottointervalli per lo
stesso campo separati ciascuno da una virgola (es. 10-12,20 significa alle
ore 10 a.m, 11 a.m., 12 a.m., 8 p.m). Il valore speciale * indica un
valore qualsiasi.
Il comando può anche essere più di uno: usare il punto e virgola come
separatore. In effetti il comando viene lanciato da crond tramite la shell
sh (facendo /bin/sh -c ) e perciò può contenere qualsiasi comando
valido nella bourne shell.
Esempi:
# alle 5:00 a.m. ogni giorno
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
0 5 * * * date
Questo esempio dice all'utente del file crontab in cui è inserito, alle 5
del mattino qual'è la data e l'ora corrente. Notare che l'output del
comando date non viene scritto sul terminale, ma viene mandato via mail
all'utente corrispondente al nome del crontab file che contiene quella
riga. Questo assicura che l'utente non venga disturbato e che comunque
riceva il "resoconto" di wget anche se in quel momento non è loggato.
Notare che non ho inserito alcuno spazio prima dell'inizio del valore dei
minuti. Ho infatti avuto problemi col crond di Linux Peanut che ignorava
la linea se iniziava con degli spazi.
Per sperimentare, attivate crond loggando tutte le azioni, come mostrato
prima. Tramite crontab -e inserite poi una riga simile alla precedente nel
crontab dell'utente root, avendo cura di specificare ore e minuti non
troppo lontani dalla ora di adesso (che potete vedere col comando date)
per non aspettare troppo. Non vi resta che aspettare che venga l'ora
stabilita. Date poi il comando mutt (un Mail client-reader), oppure mail a
seconda del vostro sistema e vedrete che cron vi ha spedito una mail del
tipo:
From root@Peanut-Linux.localnet Sat Aug 26 22:49:07 2000
Return-Path:
Received: (from root@localhost)
by Peanut-Linux.localnet (8.9.3/8.9.3) id WAA00149;
Sat, 26 Aug 2000 22:49:07 GMT
Date: Sat, 26 Aug 2000 22:49:07 GMT
From: root
Message-Id: <200008262249.WAA00149@Peanut-Linux.localnet>
To: root@Peanut-Linux.localnet
Subject: cron: date
Status: RO
Content-Length: 29
Lines: 1
Sat Aug 26 22:49:01 UTC 2000
Se non desiderate ricevere mail da crond basta redirigere l'output del
comando appendendolo ad un file di log che potete consultare comodamente
quanto ne avete voglia (ad es. /var/log/messages), oppure scartarlo
mandandolo nel "secchio", ovvero il dispositivo nullo /dev/null. In
questi casi il comando date precedente diventa rispettivamente
date >>/var/log/messages 2>&1
e
date >/dev/null 2>&1
oppure in forma più prolissa:
date 1> /var/log/messages 2> /var/log/messages
e
date 1> /dev/null 2> /dev/null
Ecco un altro esempio di riga di crontab:
# questa è la riga che uso per aggiornare ogni lunedì alle 4 di mattina
# il mio mirror delle faq LDR (Linux Domande e Risposte)
# questo è contenuto nel file di crontab chiamato ant
# che corrisponde al mio nome utente sulla macchina pcsiwa.rett.polimi.it
# del Politecnico di Milano. Potete accederci da web dall'URL:
# http://monitor.deis.unical.it/ant/linuxfaq
#
# notare che al posto di mon ho dovuto scrivere 1 perchè
# il cron daemon di Solaris SunOS non supporta le abbreviazioni letterali
# inoltre la directory in cui si trova wget non è inclusa nel path
# in quel sistema, perciò occorre il percorso completo.
# Notare inoltre che quando il task viene eseguito tramite sh il
# path corrente è /home/ant.
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
0 4 * * 1 /usr/local/bin/wget -m -nH -P public_html
-o public_html/linuxfaq/WGET.LOG http://web.tiscalinet.it/linuxfaq
http://web.tiscalinet.it/linuxfaq/stile.css
Attenzione: qui il comando è stato diviso su più righe per farlo
stare nella pagina. Nel vero file deve essere scritto tutto su una riga
ed è meglio non lasciare righe vuote alla fine.
Notate che per evitare di ricevere l'output di wget per mail, ho fatto
salvare il log nella stessa directory che contiene tutto il sito
(/home/ant/public_html/linuxfaq) con il nome WGET.LOG. Questo ha richiesto
che la prima volta creassi a mano questa directory (con un mkdir
~/public_html/linuxfaq), altrimenti wget non è in grado di creare il file
WGET.LOG e dà errore. Quando un comando non emette alcun output (come wget
con l'opzione -o), crond non vi manda una e-mail (poichè avrebbe il body
vuoto e sarebbe solo un inutile disturbo), quindi non ricevo alcuna mail e
non occorre redirigere lo stdin e lo stderr di wget a /dev/null. Notate
inoltre che ho dovuto dire esplicitamente a wget di prelevare il file
stile.css perchè wget non segue i link del tipo:
<LINK REL="stylesheet" TYPE="text/css" HREF="stile.css">
Per le particolarità di cron di SunOS digitate al prompt di una shell:
man cron
man crontab
Notare cche sotto SunOS ogni utente può manipolarsi da sè il suo crontab
se il root decide di permetterlo.
Questo esempio mette in evidenza che DAYOFWEEK si può specificare anche
tramite un numero; poichè per gli inglesi e gli americani la settimana
inizia la domenica e non il lunedì, 0 sta per Sunday (domenica) e non
per lunedì (che è invece 1). Tuttavia preferisco i nomi abbreviati
perchè sono più leggibili, se il crond li supporta.