In un recente progetto mi sono imbattuto nelle cron expression, sintassi molto semplici per definire la schedulazione di un job, così ho cercato differenti soluzioni scoprendo che ne esistono molteplici.
Se avete familiarità con Linux avrete sicuramente sentito parlare del comando cron, un job scheduler semplice da utilizzare. Il job utilizza un file crontab, diminutivo di cron table, all’interno del quale vengono inseriti la periodicità e il comando da eseguire utilizzando la sintassi delle cron expression:
# .---------------- [m]inute: minuto (0 - 59) # | .------------- [h]our: ora (0 - 23) # | | .---------- [d]ay of month: giorno del mese (1 - 31) # | | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr... # | | | | .---- [w]eek day: giorno della settimana (0 - 6) (domenica=0 o 7) # | | | | | OPPURE sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * comando da eseguire
Ho deciso quindi di implementare uno script che rispettasse i seguenti requisiti:
- Deve essere scritto in Python ed eseguito utilizzando la shell Bash o simili.
- La cron expression deve avere un ampio range di periodicità di esecuzione:
- Una volta al giorno.
- Ogni venerdì.
- Il primo giorno dell’anno.
- …
- Lo script deve essere facile da implementare.
In questo blogpost vi guiderò alla creazione di un container Docker per un semplice script che esegue un crontab che stampa a console la stringa Saluti da Intré
.
Il progetto
Tramite Docker creiamo il container per rendere concreta e portatile l’applicazione, di seguito vi riporto il codice di configurazione del file cron_Setup.Dockerfile
:
FROM alpine:3.15 RUN apk add --update --no-cache bash dos2unix WORKDIR /usr/scheduler COPY crontab.* ./ COPY start.sh . RUN dos2unix crontab.* && \ find . -type f -iname "*.sh" -exec chmod +x {} \; CMD ["./start.sh"]
Scriviamo ora lo script start.sh
che si occuperà di caricare il giusto crontab da eseguire, per l’esempio creeremo un ambiente di prova chiamato Dev
:
#!/bin/bash if [ -z "$ENVIRONMENT" ]; then echo "ENVIRONMENT not set, using Dev" ENVIRONMENT="Dev" fi CRON_FILE="crontab.$ENVIRONMENT" echo "Loading crontab file: $CRON_FILE" crontab $CRON_FILE echo "Starting cron..." crond -f
Come potete vedere dal codice, lo script caricherà il file crontab.Dev
contenente la cron expression che ho scritto all’inizio dell’articolo, ovvero:
* * * * * echo 'Saluti da Intré'
Non rimane che fare la build ed eseguire l’immagine Docker:
docker build -f cron_setup.Dockerfile . -t cron docker run cron
A video noterete la scritta Saluti da Intré
stampata di continuo, finché non verrà interrotta l’esecuzione.