Nella nostra azienda abbiamo spesso la necessità di eseguire una serie di attività altamente meccaniche e ripetitive.
La cosa migliore in questi casi è quella di automatizzare il più possibile queste operazioni in modo da non sprecare tempo per attività che possono essere eseguite tranquillamente da un computer.
Nel momento in cui la necessità è che queste operazioni meccaniche vengano eseguite con una certa regolarità possiamo affidarci ai cronjob.
In Django è presente un comodissimo plugin che ci permette di gestire i cronjob in maniera semplice e immediata. Questo plugin è django-crontab.
django-crontab
Per installare il plugin possiamo avvalerci di pip e utilizzare il seguente comando:
pip install django-crontab
E successivamente aggiungerlo alle nostre app nel file settings.py del nostro progetto django.
Una volta completata l’installazione lanciamo il comando:
python manage.py migrate
A questo il plugin è operativo e possiamo scrivere cronjob come normali classi python.
All’interno di un modulo di una nostra applicazione Django creiamo il file cron.py.
Al suo interno andremo a scrivere normalissime funzioni come siamo abituati a fare all’interno del file views.py
def funzione_per_cronjob():
#codice della nostra funzione
Una volta impostata a questo punto dobbiamo modificare il file settings.py per dirgli quali e quando i cronjob devono essere eseguiti.
Aggiungiamo quindi nel file dei settings la seguente lista:
CRONJOBS = [
('30 * * * *', 'classes.cron.send_post_email', '2>> /tmp/send_post_email.log'),
]
In questo esempio sto dicendo a Django che il cronjob send_post_email che si trova all’interno del modulo classes nel file cron.py deve essere eseguito ogni giorno, ad ogni ora, esattamente ai 30.
Verrà quindi eseguito alle 00:30, alle 01:30, alle 02:30 e così via tutta la giornata, tutti i giorni dell’anno.
Se non sei famigliare con la sintassi dei cronjob per specificare quando deve essere eseguito puoi dare un’occhiata a questa pagina.
Come vedi ogni riga è però composta da 3 parametri.
Il primo indica la frequenza. Il secondo quale funzione deve essere eseguita mentre nel terzo possiamo specificare l’output.
Il “problema” dei cronjob è che può diventare molto difficile eseguirne il debug in quanto l’output degli script (di default) non è visibile da nessuna parte.
Grazie al terzo parametro:
'2>> /tmp/send_post_email.log'
Noi diciamo a Django di redirezionare lo stderr all’interno del file di testo presente in /tmp/.
Un piccolo ripasso veloce.
Tutti i sistemi basati su Unix (quindi sia Linux che Mac OS) forniscono 3 canali standard per l’input e l’output.
- Stdin: identificato dal codice 0 è lo standard input
- stout: è lo standard output identificato dal codice 1
- stderr: è l’output predefinito per gli errori, identificato dal codice 2
Nel comando che noi andiamo a specificare nel nostro cronjob, diciamo specificatamente a Django di redirezionare l’output standard per gli errori su un file.
In questo modo quando e se si verificherà un errore in un nostro script, potremmo vedere il relativo log all’interno del file specificato.
Una volta impostato il tutto non ci resta che dire a Django di inserire il cronjob nella crontab del sistema.
Per farlo è necessario utilizzare il seguente comando:
python manage.py crontab add
E in automatico il plugin si occuperà di salvare il tutto nella crontab.
Possiamo poi verificare che sia stato effettivamente inserito utilizzando il seguente comando:
crontab -l
Come fare se volessimo rimuovere il cronjob inserito?
python manage.py crontab remove