Ninuzzo Programming Page / Home / Wget tutorial / Pagina 4
Fine Pagina
Software

pftp
php-msql-admin

Tpad
WikiLearn


Webmastering

Allineare un applet
Entities-list
Mappa dei 140 colori
Window creator


Linguaggi

C
C++
Kiss: my programming language!
PHP
Tcl/Tk
Teoria
XML


Utility

Calendario
Calcolatrice
Giochi
Info su questo server
Mirror di LDR
Motori di ricerca
Ninuzzo Link Collection


Linux - Unix

Apache Log Rotation
Apache+PHP+MySQL
Cache DNS con BIND
Demo grafici
Firewall
Htdig
info-tut
permessi
Samba
Shell
Slide del corso
Wget tutorial


Scienza

Matematica, Fisica


Newsletter: tips, links, novità del sito.
Archivio messaggi

Admin
Liberiamo l'hardware


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.

<< Problemi con i link Manutenzione del mirror >>

Inizio Pagina
Copyleft 2001 Antonio Bonifati. Tutto il materiale è distribuito con licenza GNU GPL.