Cron job con crontab

Il programma crontab fa parte delle utility di Unix (GNU/Linux compreso); crontab si occupa di eseguire dei comandi (detti cron job o cronjob) in un preciso istante specificato dall’utente. Un demone, crond, sta in esecuzione sul computer e controlla ogni minuto se c’è un compito da svolgere che è stato pianificato per quel momento.

Quindi crontab serve per indicare al demone quando e quale comando eseguire.

Come si fa a pianificare l’esecuzione di un cron job?

Per preparare l’esecuzione periodica di un cronjob è necessario inserire in un file crontab una riga che specifici, usando una particolare sintassi, cosa svolgere e quando.

Un file crontab contiene alcune righe, tante quante sono i cronjob pianificati, con una struttura simile:

Gli asterischi rappresentano le posizioni dove indicare i valori per i minuti, l’ora, il giorno del mese, il mese, il giorno della settimana nel quale il comando verrà eseguito. Per impostare i valori si può usare la sintassi qui descritta:

  • L’operatore virgola (‘,’) specifica una elenco di numeri, ad esempio: “1,3,4,7,8”.
  • L’operatore trattino (‘-‘) indica un intervallo di valori, ad esempio: “1-6”, che equivale a “1,2,3,4,5,6”.
  • L’operatore asterisco (‘*’) specifica tutti i possibili valori di un campo. Un asterisco nel campo dell’ora è equivalente a “ogni ora”.

Esiste anche un operatore supportato da alcune versioni estese del demone, l’operatore slash (‘/’), che può essere usato per saltare un certo numero di valori. Ad esempio, “*/4” nel campo dell’ora equivale a “0,4,8,12,16,20”; l’operatore “*” specifica “ogni ora”, ma il “/4” indica che solo il primo, quarto, settimo e così via dei valori restituiti da “*” vengano usati, in quanto esegue solamente i multipli di 4 (o meglio quei valori che con la divisione per interi restituiscono resto pari a zero).


I valori ammissibili delle posizioni sono:

  • Da 0 a 59 per i minuti
  • Da 0 a 23 per le ore
  • Da 1 a 31 per i giorni del mese
  • Da 1 a 12 per i mesi dell’anno
  • Da 0 a 6 per i giorni della settimana, dove 0 è domenica e 6 rappresenta il sabato.
Esempi d’uso

08 03 * * * rm -r /home/mee/temporaries/

Alle 3.18 (di notte) di ogni giorno svuota il contenuto della cartella temporaries che si trova nella home dell’utente mee.

58 5 * * 1 touch /home/mee/log_$(date +\%Y\%m\%d).txt

Crea un file con nome log seguito dalla data ogni lunedì mattina a due minuti alle sei. Attenzione se si usa un comando che fa uso di % è necessario anteporre al carattere la barra ‘\’.

*/20 8-17 * * 1-5 freshclam

Esegue il cron job freshclam (ricerca delle definizioni dell’antivirus ClamAV) ogni venti minuti tutti i giorni lavorativi dalle otto di mattina fino alle cinque del pomeriggio.

Per svolgere un cronjob ogni 2 ore: * */2 * * * cp /home/mee/dati.img /bk/

0 15 4,5 6 0 mv pippo pluto

Il comando verrà eseguito alle 15.00 del 4 e 5 giugno ma anche ogni domenica di giugno in quanto il terzo e il quarto parametro vengono valutati veri quando almeno una dei due valori è vera; perciò sia quando è vera la prima condizione sia quando è vera l’altra il cron job è eseguito.

Come si registra un cron job?

Per mettere un cron job in attesa di esecuzione si può creare un file con all’interno le righe con i cronjob da svolgere e “inviarli” al crontab.

crontab /home/mee/cronjobs.ct

Indica di pianificare i comandi inseriti nel file di testo cronjobs.ct, posto nella home dell’utente.

crontab -r

Col comando sopra vengono rimossi tutti i cronjob impostati con il comando crontab. Mentre con il comando crontab -l sono elencati i cron job programmati e il file di crontab.

Inserendo MAILTO=user@domain.com, prima di una voce nel file di crontab personalizzato si può ricevere un messaggio di posta elettronica se ci sono dei problemi con l’attivazione del cronjob che segue l’indirizzo e-mail.

15 pensieri riguardo “Cron job con crontab

  1. Marco ha detto:

    Grazie mille per questo articolo. Hai risolto molti dei miei dubbi!!!

  2. Gianni ha detto:

    Ciao Valent!
    Ho letto il tuo articolo ma non avendo molta esperienza non riesco a mettere in pratica i tuoi insegnamenti.

    Dovrei fare la copia ogni 3 minuti di alcini database che risiedono sul mio server
    ma non conosco i comandi per farlo.

    Attualmente uso questa riga di comando ma non funziona e non capisco il motivo:
    cp /var/lib/mysql/database/* /var/lib/mysql/copiadatabase/

    e in crontab ho impostatola seguente riga:
    */3 * * * * root sh /root/movmysql.sh

    Cosa stò sbagliando?

    Ps. il database che vado a copiare devo usarlo sullo stesso server.

    Ciao

  3. valent ha detto:

    Il compito devi impostarlo come root.
    il cancelletto indica che devi essere collegato come root oppure usa il comando sudo con ubuntu. Per modificare i vari cronjob.
    # crontab -e
    Il file movmysql.sh deve essere eseguibile mettici un 755, cioè:
    # chmod 755 movmysql.sh
    Se ogni tre minuti non dovesse succedere nulla metti metti queste righe nel crontab al posto di quella che usi tu:

    SHELL=/bin/bash
    */3 * * * * /root/movmysql.sh >> /tmp/movmysql.log 2>&1

    Vedi poi se esiste /tmp/movmysql.log e se c’è scritto qualcosa.

  4. Gianni ha detto:

    in effetti ora la ripetizione dell’operazione funziona
    ma non mi vengono copiati i data base.

    Rimangono sempre i vecchi.

    Prima ho usato questa riga di comando:
    cp /var/lib/mysql/database/* /var/lib/mysql/copiadatabase/

    poi questa:
    #rsync -auv –delete /var/lib/mysql/database/* /var/lib/mysql/copiadatabase/

    e non va con nessuna delle due
    cosa posso fare?
    dove sbaglio?

  5. valent ha detto:

    E questo non funziona?

    SHELL=/bin/bash
    */3 * * * * cp /var/lib/mysql/database/* /var/lib/mysql/copiadatabase/ >> /tmp/cpmysql.log 2>&1

  6. Gianni ha detto:

    con le varie prove effettuate ho capito il problema…
    in pratica la copia del database viene eseguita ma il database aggiornato non viene riconosciuto tale se non viene eseguito il riavvio di mysql

    Un bel problema…

    Ci sono altri modi per poter riavviara un singolo database o per far riconoscere l’aggiornamento?

  7. Gianni ha detto:

    dimenticavo… stò usando questa stringa

    #rsync -auv –delete /var/lib/mysql/database/* /var/lib/mysql/copiadatabase/

  8. valent ha detto:

    Perchè non usi uno strumento come mysqlhotcopy?

  9. Gianni ha detto:

    Ma come si usa il flush_option come dovrei compilare il comando?

    Ho provato ad utilizzare il mysqlhotcopy ma in pratica quando creo il primo file non mi fa sovrascrivere il secondo.

    C’è qualche impostazione che posso dare per far fare la sovrascrittura?

  10. TonyPuma ha detto:

    Ciao Vale!
    Io avrei bisogno del tuo aiuto, per il mio sito web PubbliPTR.Net Free NetWork Private.
    Ho il programma PTP (pagati per promuovere ecc..) e ho bisogno di svuotare ogni 12 ore tramite Cron jobs.
    Ora li faccio manualmente, ma se un giorno dimentico la memoria del sever scoppia!!!
    Non sono un esperto linux
    Contattami!!!

  11. valent ha detto:

    Siccome non conosco il programma dovresti dirmi di più, che operazione fai per svuotare?

  12. Giancarlo ha detto:

    Ciao io o un problema ogni Domenica mattina trovo il mio sito off-line , però mi basta dare il seguente commando con Putty :
    sudo /etc/init.d/apache2 restart è il mio sito ritorna on-line hai una soluzione per questo problema , avrei pensato uno script che controlli apache2 ogni 60 secondi il quale se è fermo lo faccia ripartire in automatico . O provato a fare dei tentativi ma senza risultato .

  13. valent ha detto:

    Strano. Trovarsi con Apache fermo è abbastanza difficile.
    Dovresti controllare nei log (Debian/Ubuntu) /var/log/apache/error.log se c’è qualche messaggio particolare.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *