Code, Learn

Job scheduling e cron expression

5 Aprile 2022 - 2 minuti di lettura

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.

Articolo scritto da