Altro [X ESPERTI] CRON E FILE .SH

flippo95

Utente Silver
5 Marzo 2012
57
9
9
63
Ultima modifica:
Salve a tutti, ho bisogno che il mio raspberry si riavvii tutti i giorni alle 4 di notte e ad ogni riavvio del pc (che sia quello impostato alle 4 di notte o un riavvio manuale) mi avvii uno script in python.

Ho fatto in questo modo:
1) ho scritto un .sh con il seguente codice, per avviare il virtualenv e il python (unica strada per far avviare prima il virtualenv e poi il python), testato senza cron da terminale e funziona a dovere
Codice:
#!/bin/bash

source ~/Desktop/bot/bin/activate && python3 ~/Desktop/bot/kernel.py

2) Ho provato a settare il mio cron, tramite i seguenti comandi:
sudo crontab -e (con sudo per eseguire da root)
aggiunto le seguenti righe
Codice:
0 4 * * * /sbin/shutdown -r now
@reboot bash /home/pi/Desktop/avvio.sh
Salvato, uscito e controllato la presenza delle stringhe cron tramite comando sudo crontab -l e sono presenti.

Ho riavviato per vedere se mi è stato eseguito al reboot il python, sono andato su .../log/syslog.txt e mi è comparsa la stringa
Jun 17 17:48:54 raspberrypi CRON[324]: (root) CMD (bash /home/pi/Desktop/avvio.sh)

Quindi suppongo sia andato tutto a dovere fino a qui, e il python sia in esecuzione. Ora mi giungono i seguenti problemi, credo siano abbastanza complessi da risolvere, spero qualcuno di voi ci riesca.

Il python genera un file db.json se non esistente, mentre se esistente utilizza i dati al suo interno.
Questo json deve trovarsi dentro alla cartella bot dove anche kernel.py si trova.

PROBLEMA 1:
Se avvio da terminale avvio.sh che a sua volta mi avvia kernel.py, mi genera il file db.json sul Desktop (ovvero nella stessa posizione di avvio.sh) e non mi legge quello già esistente all'interno della cartella che contiene kernel.py

PROBLEMA 2:
Se riavvio il pc con il crontab impostato, come detto prima dovrebbe essere tutto regolarmente in esecuzione, ma questa volta il file db.json mi viene creato all'interno di /home/pi e non mi legge quello nella stessa posizione di kernel.py che invece dovrebbe leggere.

PROBLEMA 3:
Il python se lo avvio semplicemente da terminale mi scrive su di esso dei log tramite dei print che uso come controllo, lo stesso se lo avvio con il file .sh da terminale (anche se ho il problema 2) mentre se lo avvio con crontab il terminale non si apre e non posso accedere a questi print che scrive il mio python.

COME RISOLVO QUESTI PROBLEMI?
Messaggio unito automaticamente:

Piccola intuizione appena avuta ma correggetemi se sbaglio...per il problema relativo alla posizione del file db.json forse devo intervenire direttamente nel codice python e dargli una posizione assoluta tipo /home/pi/Desktop/bot/db.json e non solo db.json

Devo testare ancora questa intuizione, ma non so se risolve il problema.....

IL PROBLEMA 3 RIMANE PER ME IRRISOLTO e non so dove mettere mano
 
Problema 1: devi inserire un path assoluto.
Problema 2: devi inserire un path assoluto.
Problema 3: devi redirigere l'output, presumo che ti interessi stdout (l'output normale) che stderr (gli errori) quindi roba tipo
Codice:
@reboot bash /home/pi/Desktop/avvio.sh >> /home/filippo95/avvio.log 2>&1
oppure
Codice:
source ~/Desktop/bot/bin/activate && python3 ~/Desktop/bot/kernel.py >> /home/filippo95/kernel.log 2>&1
oppure gestire il problema direttamente da python.
 
Problema 1: devi inserire un path assoluto.
Problema 2: devi inserire un path assoluto.
Problema 3: devi redirigere l'output, presumo che ti interessi stdout (l'output normale) che stderr (gli errori) quindi roba tipo
Codice:
@reboot bash /home/pi/Desktop/avvio.sh >> /home/filippo95/avvio.log 2>&1
oppure
Codice:
source ~/Desktop/bot/bin/activate && python3 ~/Desktop/bot/kernel.py >> /home/filippo95/kernel.log 2>&1
oppure gestire il problema direttamente da python.


Ok funziona. C'è un problema. Mi sono accorto che non mi avvia l'ambiente virtuale con il comando

source ~/Desktop/bot/bin/activate