Django, cronjob e stderr

Django, cronjob e stderr

Pubblicatodi il Ago 14, 2019 in Programmazione
Nessun commento

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

# # # #

Rispondi