Di default, il cron job scheduler di Linux non supporta la definizione di uno scheduling per secondi. Infatti l’unità minima specificabile in cron è 1 minuto. Tuttavia, è possibile applicare alcuni semplici workaround per avere i propri task con uno scheduling impostato in secondi.
Sintassi di crontab
Sintatticamente un cronjob è definito nel seguente modo
A B C D E USERNAME /path/to/command
- A → minuti
- B → ore
- C →giorni
- D →mesi
- E →giorni della settimana
USERNAME
è lo user con il quale invocare il comando
/path/to/command
è il path completo al comando oggetto di scheduling
Addizionalmente possono essere utilizzati i seguenti operatori:
(,) → specifica di una lista di valori
– → specifica di un range di valori
/ → definizione di uno step value
Per esempio, il seguente definisce un cronjob che viene lanciato ogni secondo giorno del mese alle 4:30 PM
30 16 2 * * /path/to/script.sh
Vediamo ora come schedulare un cronjob per essere eseguito ogni 30 secondi.
Come eseguire un cronjob ogni 30 secondi
Sostanzialmente, quello che faremo è creare due entries in crontab. Con la prima definiamo un job che esegue il comando ogni minuto, mentre la seconda entry eseguirà prima il comando di sleep per aggiungere un delay di 30 secondi e successivamente invocare lo stesso comando della prima entry. Vediamo ora come realizzarlo.
Aprire crontab
Apriamo il terminale e lanciamo il seguente comando per aprire crontab:
crontab -e
Aprire crontab
Aggiungiamo le seguenti righe nella nostra crontab:
* * * * * /usr/bin/date >> /tmp/date.log
* * * * * sleep 30; /usr/bin/date >> /tmp/date.log
Nel nostro esempio utilizziamo il comando date. Sostituirlo con il comando desiderato per adattarlo ad ogni necessità.
Verificare l'esecuzione corretta dello scheduling
Lanciamo quindi il seguente comando per verificare il corretto funzionamento del nostro scheduling:
tail -f /tmp/date.log
Noteremo che ogni 30 secondi viene aggiunta una riga al nostro file di log e questo conferma l’efficacia del workaround che abbiamo applicato.
Come eseguire un cronjob ogni 10 secondi
Secondo la logica definita qui sopra, possiamo estendere il nostro workaround per far eseguire a crontab un task ogni 10 secondi. In questo caso la nostra crontab dovrà essere popolata nel seguente modo:
* * * * * /usr/bin/date >> /tmp/date.log
* * * * * sleep 10; /usr/bin/date >> /tmp/date.log
* * * * * sleep 20; /usr/bin/date >> /tmp/date.log
* * * * * sleep 30; /usr/bin/date >> /tmp/date.log
* * * * * sleep 40; /usr/bin/date >> /tmp/date.log
* * * * * sleep 50; /usr/bin/date >> /tmp/date.log