Inserisci qui la tua pubblicità
Una funzione importante all'interno del nostro Raspberry Pi, è la possibilità di poter eseguire determinati script a determinati orari pre-stabiliti. Un esempio è dato senza ombra di dubbio dalla possibilità di attivare la funzionalità di videosorveglianza durante la notte.
Cron è un tool presente su tutti i sistemi Unix che ci consente di schedulare task secondo le nostre esigenze, ovvero ci permette di eseguire comandi o script che si avviano periodicamente e a intervalli fissati.
Il comando **cronotab** viene utilizzato per modificare l'elenco di operazioni pianificate, ed è costruito in funzione dell'utente, infatti ogni utente ( compreso root) ha il proprio **crontab**
**Modifica Crontab**
Per modificare il crontab, eseguire il comando
-e contab
La prima volta che viene eseguito crontab ci verrà richiesto di scegliere un editor, scegliamo senza timori l'editor nano cliccando Invio.
Il layout del crontab è costituito da 6 componenti:
- minuto
- ora
- giorno del mese
- mese dell'anno
- giorno della settimana
- il comando da eseguire
Vediamo un esempio
# Mh dom comando mon dow
.---------------- [m]inute: minuto (0 - 59)
| .------------- [h]our: ora (0 - 23)
| | .---------- [d]ay [o]f [m]onth: giorno del mese (1 - 31)
| | | .------- [mon]th: mese (1 - 12) OPPURE jan,feb,mar,apr...
| | | | .---- [d]ay [o]f [w]eek: giorno della settimana (0 - 6) (domenica=0 o 7) OPPURE sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * Comando da eseguire
Per esempio:
0 0 * * * /home/pi/backup.sh
Questo comando esegue lo backup.sh ogni giorno a mezzanotte
**PS**. per abilitare il log del cron ( su raspbian di default è disabilitato) bisogna eseguire:
sudo nano /etc/rsyslog.conf e togliere il commento da
#cron* /var/log/cron quindi riavviamo
/etc/init.d/rsyslog restart
Il risultato del cron sarà in :
/var/log/syslog
----
Problematiche
-----------------
Vediamo quali problematiche possono sorgere durante l'esecuzione degli script e in particolare andiamo ad analizzare un paio di problematiche che possono andare in conflitto e quindi portare alla cattiva riuscita dell'esecuzione automatica degli script.
Innanzitutto va ricordato che affinché uno script possa essere eseguito dobbiamo rendere il file eseguibile, per fare questo eseguiamo
sudo chmod +x nomefile.sh
o in alternativa
sudo chmod 755 nomefile.sh
Questa procedura può essere saltata se lo script è eseguito dall'utente root.
Quindi per rendere lo script eseguibile in automatico andiamo da terminale eseguiamo:
sudo nano /etc/rc.local
Quindi dopo le linee commentate andiamo a inserire:
sudo /home/pi/projects/nomefile.sh &
Sudo indica che vogliamo che lo script venga eseguito con i privileggi di amministratore, e & indica che vogliamo che venga eseguito in background, se non ci interessano possiamo anche eliminarle. Andiamo ora a vedere un'altra procedura per eseguire automaticamente uno script.
----
Seconda Procedura
-----------------
La seconda procedura ( che io preferisco alla prima ) è quella di creare uno script e richiamarlo in automatico ( dal crontab ) . Per far questo eseguiamo:
mkdir ./bin
cd ./bin
Quindi creiamo uno script prova.sh scrivendo da shell sudo nnao prova.sh , quindi previamo invio e andiamo a inserire nel file il codice:
#!/bin/bash
# Script to start our application
echo "Doing autorun script..."
Il file di prova è pronto, per eseguirlo rendiamo il file eseguile scrivendo chmod +x /home/pi/bin/prova.sh
Siamo pronti. Per eseguire il file basterà eseguire il comando da shell:
/home/pi/bin/prova.sh
----
Soluzione Presa dal Web
-----------------------
La domanda era se si volesse eseguire lo script ogni primo mercoledi di ogni mese, alle ore 12 ?
La questione non è banale.
Non essendoci in cron la possibilità diretta di impostare una regola di questo tipo, una possibile soluzione è quella di inserire nello script da eseguire una valutazione sulla giornata attuale. La verifica della condizione se il giorno in corso è Mercoledì, con conseguente uscita diretta se è un qualsiasi altro giorno. Soluzione poco elegante e di difficile interpretazione da parte di altri in caso di manutenzione. Decido di cercare qualcosa di diverso.
In prima approssimazione il comando che mi viene spontaneo creare è il seguente
0 12 1-7 * 3 job.sh
0 = minuto 0
12 = ora 12
1-7 = giorni del mese da 1 a 7, considerando che il *primo* Mercoledì deve essere in questo intervallo
* = tutti i mesi
3 = giorno della settimana Mercoledì
job.sh = script da eseguire
Apparentemente ha una sua ragion d’essere, ma c’è qualcosa che non va. Infatti l’impostazione 1-7 non è alternativa all’indicazione del giorno 3 (Mercoledì). In altre parole causa l’esecuzione in ognuno di quei giorni e non solo il primo Mercoledì.
La soluzione corretta (perlomeno una che mi piace) è questa
0 12 * * 3 [ `date +\%d` -le 7 ] && job.sh
0 = minuto 0
12 = ora 12
* = qualunque giorno del mese
* = tutti i mesi
3 = giorno della settimana Mercoledì
[ `date +\%d` -le 7 ] &&
job.sh = script da eseguire
La magia avviene nella condizione [ `date +%d` -le 7 ] && della shell bash che restituisce un codice d’uscita basato sul fatto che la condizione sia vera o falsa. Se la condizione è vera si avrà l’esecuzione dello script, viceversa no. Inserendolo in crontab è necessario delimitare con backslash (\) il selettore %.
Ciò che stiamo facendo è una chiamata alla shell che valuta `date +%d`, ovvero esegue il comando date con l’attributo +%d, che restituisce il valore numerico di oggi, ad esempio 02.
Il resto della condizione -le 7 verifica se quel valore, il numero del giorno attuale, è minore o uguale a 7. Se è così, allora il giorno è nella prima settimana del mese, quindi viene restituito 1/vero, altrimenti il codice restituito è 0/falso e l’esecuzione viene fermata.
Quindi il comando viene eseguito da cron ogni settimana, di mercoledì, ma procede con il lancio dello script solo quando viene eseguito nei primi 7 giorni del mese.
----
Soluzione dal web per script motion
-----------------------------------
Sul computer che uso per il controllo ho creato tre files eseguibili (ovviamente la directory "/home/$USER/bin" e` nel path di ricerca degli eseguibili).
**"/home/$USER/bin/RaspberryPi-motion.sh"**
L'avvio di motion-mmal
#!/bin/bash
# Stop motion
/home/$USER/bin/RaspberryPi-motion-stop.sh
# Start motion
ssh pi@ /home/pi/motion-mmalcam/motion -n -c /home/pi/motion-mmalcam/motion-mmalcam.conf &
**"/home/$USER/bin/RaspberryPi-motion-stop.sh"**
Lo stop di motion-mmal
#!/bin/bash
# Stop motion
ssh pi@ /home/pi/motion-mmalcam/motion-kill.sh
sleep 2
**"/home/$USER/bin/RaspberryPi-stream.sh"**
Avvia lo streaming fra i due pc, ed il client video sul pc locale
#!/bin/bash
# Stop motion
/home/$USER/bin/RaspberryPi-motion-stop.sh
# Start camera e streaming (in ascolto, switch -l di 'nc')
ssh pi@ "raspivid -w 640 -h 360 -fps 12 -rot 180 -t 0 -o - | nc -l 10301" &
sleep 2
# Start local player
nc 10301 | mplayer -fps 30 -demuxer h264es -
barone.anto1@gmail.com
Iscriviti alla nostra newsletter
Iscriviti alla nostra newsletter per non perderti nessuna novità!