Uno shell script

Questo script è  sistema totalmente automatizzato per programmare il download di dati dalla rete, a qualsiasi ora del giorno o della notte. Non è necessario essere amministratori di sistema per installare gli script che vi propongo, per cui penso che questo possa essere di grande interesse per tutti coloro che possiedono un account su una macchina connessa alla rete 24 ore su 24.

Il procedimento qui presentato si basa sull'uso di una piccola ma potentissima utility: wget.
Prima di procedere oltre, sinceratevi che essa sia installata sul vostro sistema. Potete scaricare l'ultima release di wget qui.

Assumendo che abbiate una versione funzionante di wget sul vostro sistema, ora possiamo realizzare il nostro progetto.
Per prima cosa, entrate nella vostra home directory e create 3 subdirectory: bin, incoming e logs

Nella directory bin metteremo gli script che gestiscono il sistema, nella directory logs andranno i file di log creati durante il processo di download, ed infine nella directory incoming verrano messi i file che scaricherete.

Il file .to_download è quello destinato a contenere gli URL che volete scaricare; basterà scrivere all'interno del suddetto file l'indirizzo URL della risorsa che volete scaricare, e il sistema farà tutto per voi.

Analizziamo ora lo script download. Si tratta dello script principale, quello che si occupa del download vero e proprio dei dati.


******************************************************************

#!/bin/bash

COUNT=0
LOGFILE=""
LINKSFILE="logs-`date '+%d.%m.%Y'`.txt"

# Inizializza il sistema per un nuovo download

if test -s $HOME/.to_download
then
# pulisce ls directory $HOME/logs...
rm $HOME/logs/* &> /dev/null
# crea un file vuoto
:> $HOME/logs/$LINKSFILE
fi

for i in `cat $HOME/.to_download`
do
COUNT=`expr $COUNT + 1`

LOGFILE="log-`basename $i`.$COUNT.txt"

nohup wget $i &> $HOME/logs/$LOGFILE &

echo "$LOGFILE -> $i" >> $HOME/logs/$LINKSFILE
done


******************************************************************

Il comportamento dello script è il seguente: esso per prima cosa compie un piccolo test sul file .to_download.
Se esso non è vuoto, allora il sistema si prepara ad una nuova sessione di download, rimuovendo i vecchi file di log e preparandosi a crearne di nuovi.
Dopodiché lo script legge ogni singola entry del file .to_download, e la invia al programma wget, che provvede al download.
Inoltre lo script crea un indice per i file di log, che avrà un nome del tipo logs-gg.mm.aaaa.txt, (dove gg/mm/aaaa è la data al momento del download)
e che ovviamente sarà messo nella directory logs.

Successivamente al download, è possibile comprimere i dati in modo da occupare meno spazio nel caso in cui abbiate qualche problema di "quota". Questo è il compito dello script dozip:

#!/bin/bash

FILE="$HOME/incoming-`date '+%d.%m.%Y'`.tar"

tar cvfP $FILE $HOME/incoming

bzip2 $FILE

# se non avete bzip installato commentate la linea precedente
# e decommentate la successiva
# gzip -9 $FI
LE


Lo script dozip comprime tutti i file della directory incoming; da notare il fatto che per default lo script dozip fa uso della utility bzip2 (molto più efficiente di gzip) per comprimere i file. Se non disponete di tale utility sul vostro sistema, allora cancellate il comando:

bzip2 $FILE
per sostituirlo con il seguente:
gzip -9 $FILE

Ora resta da rispondere alle domande più importanti. Come e quando vengono eseguiti gli script? In che modo automatizzare il procedimento? Ci sono due modi diversi per eseguire il download ad un'ora programmata: il primo sfrutta il comando at, mentre il secondo si basa sul cron daemon.

Vediamo ora come funziona il primo metodo. Supponiamo che abbiate già inserito nel file .to_download gli URL da scaricare, e che voglate programmare il download in modo che inizi alle 22:00. Allora il comando da digitare è il seguente:

at -f $HOME/bin/download 22:00

Una volta impostato il precedente comando, il download inizierà la prossima volta che l'orologio di sistema segnerà le ore 22:00. Se si vuole comprimere i dati dopo il download, è possibile programmare l'esecuzione dello script dozip successivamente allo script download (assicurandosi di lasciare al sistema il tempo necessario per completare il download), ad esempio con il comando:

at -f $HOME/bin/dozip 6:30

ATTENZIONE: poiché gli script download e dozip vanno eseguiti in sequenza, fate attenzione all'ora in cui digitate i due comandi. Se nel caso precedente aveste digitato entrambi i comandi, in qualsiasi sequenza, alle 5:30, sarebbe stato eseguito prima lo script dozip e poi lo script download.

Il problema con il comando at è che esso viene eseguito una tantum (ovvero una e una sola volta), e ciò vuol dire che ad ogni download sarete costretti ad impostare di nuovo i comandi. Questo va bene se di solito programmate un download ogni 2-3 settimane, ma se, come me, vi trovate nella situazione di dover scaricare grosse moli di dati quasi quotidianamente, allora il metodo ideale per voi è il secondo.