Come creare un cron job

creare job con crontab

Creare un cron job è un operazione utile in tantissimi casi.
Un cron job non è nient’altro che un’azione che verrà eseguita in un determinato momento oppure ogni tot di tempo, da un programma che è costantemente in esecuzione nel sistema operativo e che si chiama cron.

La guida che ti presento è scritta per Ubuntu 18:04 ma ogni sistema Unix/Linux e anche MacOS ha il suo bel cron che gira e che ci permette di usare.

Partiamo con il dire che utilizzeremo un file dal nome crontab.
Questo file ci permetterà di configurare in modo molto più semplice il nostro cron job, rispetto ad utilizzare direttamente la struttura di cron.

Ti ricordo che in qualunque momento puoi vedere il manuale eseguendo il comando man 5 crontab oppure consultando la sezione wiki apposita di Ubuntu.

Il sistema ha un suo file cron che è presente in /etc/crontab ma ogni utente può creare il suo, per questo motivo, se hai necessità di eseguire comandi in root, che quindi necessitano dei privilegi di amministratore, sarebbe più corretto che facessi il login come amministratore, prima di creare il file crontab.

Per modificare un file crontab ti basterà scrivere

crontab -e

Una volta scritto il tuo comando nel crontab, salva il file e controlla che sia stato inserito correttamente digitando:

crontab -l

In questo modo comparirà una lista di job per l’utente corrente.

Sintassi del comando

Il file crontab deve rispettare una sintassi precisa, la prima parte riguarda quando il comando deve essere eseguito e segue una formattazione come questa:

  • minuti, da 0 a 59 (m);
  • ore, da 0 a 23 (h);
  • giorno del mese, da 1 a 31 (dom);
  • mese, da 1 a 12 (mon);
  • giorno della settimana, da 0 (Domenica) a 6 (Sabato) (dow).

Quindi per eseguire un aggiornamento dei pacchetti del sistema ogni giorno alle 2:10 troveremo una riga, nel nostro crontab simile a questa:

10 2 * * * /usr/bin/apt-get update

L’asterisco ci permette di non specificare nessun valore

Caso specifico

Nel mio caso specifico mi occorreva aggiornare i certificati SSL generati in wildcard, e per fare questo dovevo inserire un comando specifico. Quindi ho scritto il comando completo per rigenerare i certificati (che era molto lungo) in un file sotto la cartella home dell’utente, era una cosa più o meno così:

certbot renew --dns-route53 --logs-dir /home/username/letsencrypt/log/ --config-dir /home/username/letsencrypt/config/ --work-dir /home/username/letsencrypt/work/ --non-interactive --server https://acme-v02.api.letsencrypt.org/directory --post-hook "sudo service nginx reload"

Successivamente ho aperto il file crontab e inserito
0 0 * * * ./ ~/username/filedaeseguire.sh

In questo modo ogni giorno a mezzanotte il mio job proverà ad aggiornare il mio certificato SSL

Altri esempi d’uso dei tempi

StringaDescrizione
12 05 * * *tutte le mattine, più o meno alle 5
12 05 15 * *tutti i 15 del mese, alla stessa ora
12 05 31 * *7 volte l’anno, alla stessa ora
0 12 * * 1ogni lunedì, a mezzogiorno
1 0 * * *ogni giorno, più o meno a mezzanotte
01 05 * * 2,4ogni Martedì e Giovedì, alle 5 del mattino circa

Inoltre ci sono altri parametri speciale, ad esempio:

*/5 9-17 * * mon,tue,wed,thu,fri

Questo viene eseguito ogni 5 minuti dalle 9 alle 17 dal Lunedì al Venerdì.

Per altri comandi ti consiglio di vedere la guida che ti ho messo all’inizio dell’articolo

Grazie per aver letto l’articolo, le informazioni che ho messo sono tutt’altro che difficili da reperire e sono anche un po’ ridondanti, ma ho voluto comunque scriverlo per farmi un appunto di quello che avevo imparato. 👋