Uno dei problemi che si presentano nella gestione di un server è l'accumulo di file temporanei che non vengono cancellati a causa della pigrizia degli utenti o dalla poca attenzione prestata dagli sviluppatori (specialmente di siti Web) nel gestirli correttamente.

Grazie a bash, findawk e cron possiamo creare un semplice script che ci aiuterà a fare automaticamente pulizia tutte le notti nelle cartelle temporanee dei siti web.

Prerequisiti

Come al solito mi riferisco ad un ambiente GNU/Linux ma potreste riportare queste tecniche anche in ambiente Windows e Mac dato che per entrambi sono disponibili versioni di bash, find  ed awk. Per questi ambienti potrebbero essere necessarie alcune modifiche che non prenderò in considerazione in quanto esulano dallo scopo di questa documentazione.

Inoltre prenderemo in considerazione un ambiente server in cui i le directory temporanee dei siti web sono ospitati nelle in: /var/www//tmp. Per strutture differenti dovrete quindi provvedere a modificare alcune impostazioni per adeguare lo script. 

Iniziamo quindi con la creazione di uno script bash clean_clents_tmp.sh. Io matengo questo genere di file nella directory /usr/local/bin; ovviamente siete liberi di tenerlo dove volete, modificando opportunamente il riferimento (che vedremo più avanti) nella tabella crontab.

#!/bin/bash
#
# delete temp files from client temp directory
#
function clean_directory() {
	CLIENT=$1
	echo Cleaning directory: "${CLIENT}"
	echo "Size before: " $(du -hs /var/www/${CLIENT}/tmp)
	find /var/www/${CLIENT}/tmp -maxdepth 1 -path \
		"/var/www/${CLIENT}/tmp/*" -mtime +2 -print \
		| awk '{print "rm -R " $1}' |sh
	echo "Size after: " $(du -hs /var/www/${CLIENT}/tmp)
	echo ""
}
#
#####
#
for i in $(ls /var/www/); do
	if [ -d /var/www/$i/tmp ]
	then
		clean_directory $i
	fi
done

Lo script non è molto complicato e si divide in due parti:

  • la funzione clean_directory() che provvede alla cancellazione dei file temporanei
  • il ciclo for che richiama la funzione clean_directory() per tutte le directory temporanee dei siti ospitati.

A prima vista sembra che sia stata aumentata inutilmente la complessità del codice, utilizzando find, awk e rm al posto di un smplice richiamo di rm per effettuare la cancellazione dei file. A questo c'è però una valida spiegazione: per evitare che il comando rm vada in errore a causa della presenza di troppi file. Questro perché il richiamo diretto, passando la directory come parametro, verrebbe espanso passando ad rm la lista dei file; lista che se troppo lunga non può essere correttamente trattata dal comando stesso.

L'utilizzo di find ed awk nella funzione clean_directory() genera invece una serie di richiami -precisamente uno per ogni file - aggirando così il problema. Inoltre ci permette di selezionare con una certa facilità i file più vecchi di un certo periodo, tramite il parametro -mtime, che in questo caso è stato impostato a 2 giorni.

Le istruzioni alle righe 8 e 12 servono solamente a visualizzare lo spazio occupato dalla directory corrente prima e dopo la pulizia; la notazione $(...) permette di eseguire il comando contenuto tra le parentesi restituendo l'output generato, per è utilizzato per concatenare il risultato del comando du alla stringa visualizzata dal comando echo. In questo modo possiamo avere un riscontro dell'efficacia della nostra procedura.

Non ci resta quindi che schedulare un job per far eseguire la pulizia tutte le notti; nel caso di GNU/Linux possiamo utilizzare cron, impostando l'esecuzione tramite il comando:

sudo crontab -e

 che aprirà il file di configurazione di cron, dove inseriremo la riga:

20 00 * * * /usr/local/bin/clean_clients_tmp.sh

per far eseguire la nostra procedura di pulizia tutte le notti alle ore 0.20 (ovviamente l'orario può essere modificato a seconda delle vostre esigenze).