Abarone.it Logo

Programmare l'esecuzione di script

Parte 2 - Cron

Dopo aver dato un occhiata al funzionamento di cron,
vediamo come farlo funzionare in concomitanza con il software motion del nostro Raspberry PI associato alla Camera PI noir.

Ho provato a seguire più volte varie guide e tutorial presenti sul web ma sempre senza risultati. Per questo ho deciso di scrivere questa breve guida.

Ci sono quindi vari obiettivi per cui è sempre utile utilizzare cron su un sistema linu, vediamone qualcuno:

  • Se si ha un sito in cui si da la possibilità agli utenti di registrarsi, e questi account hanno una data di scadenza ( esempio si puo pensare ad utenti iscritti ad un corso annuale), in questo caso si può creare un cron che automaticamente elimina gli account scaduti.

  • Poter inviare newsletter ed e-mail giornaliere.
    Se si hanno dati nel database è possibile aggiornarli regolarmente con un cron job. Per esempio potremmo caricare ogni sommario di una pagina web in una tabella del nostro database.

  • Permetterci di cancellare cache e/o file in maniera automatica in un dato intervallo ( es. ogni ora).

  • Permette di avere un cron che controlla periodicamente se all'interno del nostro sito ci siano link rotti e ci invia di consequenza dei report.

  • Permette di schedulare dei task che consentono di avviare da linea di comando script, o altro, ad esempio invio di e-mail di massa, encoding di video ecc.

Nel mio caso, l'obiettivo finale è quello di far avviare la Camera del Raspberry PI ad un orario prefissato ( orario in cui so di non essere presente a casa) e quindi di farla spegnere automaticamente per l'orario in cui so di rientrare. Anche se a parole può sembrare facile , nella pratica ho avuto vari problemi. Vediamo a seguire come ho risolto.

Soluzione Mia

Innanzitutto ogni qual volta andavo a inserire un comando in cron non succedeva nulla, dopo vari studi e ricerche ho capito che questo non succedeva perchè cron ogni qual volta che esegue qualcosa invia un report via e-mail all'amministratore. Nel mio sistema non avevo ancora installato un servizio di invio delle e-mail e quindi andava in errore non eseguendo mai il cron. Ho risolto inserendo nella parte finale del comando che inserisco nel cron la seguente stringa:

  1. </p>
  2. <blockquote>
  3. <p>/dev/null 2>&1

Questo comando è utilizzato per rediriggere l'output. Qualsiasi cosa c'è verrà ignorato dal sistema. In questo caso "2>&1" provoca un STDERR ( errore) e l'output sarà reindirizzato al normale output STDOUT.

Una volta risolto il problema del reindirizzamento dell'output e del gestore di invio delle email andiamo a vedere come far eseguire da cron un comando bash.
Dopo aver reso il file ( nel mio caso un file .sh ) eseguibile ( ricordo a tutti che basta dare il comando chmod +x "nomefile.sh" per renderlo eseguibile) ho inserito nel cron (sudo crontab -e) la seguente stringa:

  1. 10 22 * * * (cd /home/pi/motion-mmmal && ./avvia.sh) > /dev/null 2>&1

Cosi facendo il cron alle 22:10 esegue lo script avvia.sh presente all'interno della cartella motion-mmal.

Soluzione dal web

Per completezza voglio copiare una soluzione trovata sul web, non ho avuto tempo e modo di testarla, però se qualcuno di voi lo farà posterò io o potrà farlo direttamente lui :

La soluzione consisteva nel modificare opportunatamente lo script in modo tale che funzionassero i comandi bash anche da cron. In pratica lo script originario era:

  1. </p>
  2. <h1>!/bin/bash</h1>
  3. <p>rm -f /var/www/output/*

Questo script, una volta reso eseguibile, funziona correttamente se richiamato dalla shell con un semplice clearcsv.sh ( il nome dato al file contenente il codice appena sopra) , ma questo script non viene eseguiro se da cron diamo il comando :

  1. Cron script: <em>/6 * </em> * * /home/pi/clearcsv.sh

Questo comando dovrebbe cancellare i contenuti della cartella output ogni 6 minuti, ma non lo fa.
Nella soluzione proposta presa dal web il ragazzo ha modificato lo script e cosi facendo dovrebbe funzionare ( non ho avuto modo di testarlo quindi prendetelo con le pinze, o provatelo ). Lo script e il comando da eseguire da cron quindi diventano

  1. #!/bin/bash
  2. /bin/rm -f /var/www/output/*

Il cron:

  1. */6 * * * * cd /home/pi && bash clearcsv.sh

barone.antonio@libero.it