Comment envoyer, à partir d’un Rasberry Pi, un fichier txt toutes les 20 minutes à un serveur distant ? La réponse passe par une connexion FTP et un cronjob, ou tâche planifiée.

Mes objectifs

Sur un Raspberry Pi, j’ai créé un script Shell qui relève la température, la date et l’heure, le nom du Pi et les écrit dans un fichier txt avec la chaîne de caractère définie dans la commande. Ce script, est décrit dans l’article « Raspberry Pi : Mesurer la température avec un capteur DS18B20. Le fichier texte créé s’appelle [hostname]-status.txt.

Maintenant je veux envoyer ce fichier texte à un serveur distant, en FTP.

Et je veux que cet envoi soit réalisé automatiquement toutes les 20 minutes.

Envoyer un fichier à un serveur distant en FTP

Pour connecter un Pi comme client à un serveur, il faut lui installer une application.

Pour installer le package FTP (j’ai choisi celui qui paraissait le plus léger) :

apt-get install ftp

Maintenant, je peux me connecter à un serveur distant.

Je crée le script send-status.sh, avec droits 744 (exécutable) :

#!/bin/bash

printenv

# check my Hostname variable 
ThisHost=$(hostname) 
date=$(date) 

# There should be no ECHO in a CRON job
echo $ThisHost

# $1 is the variable appended to the file when executed
# example : ./send-status.sh essai would put "essai" in $1

# local file to send
FILE=$ThisHost"-status.txt"   
# local directory to pick the file for upload
REPERTOIRE="/home/jf/temp/"
echo $REPERTOIRE$FILE

# https://www.raspberrypi.org/forums/viewtopic.php?t=68541&p=500070
# https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=51222

#credentials to access the remote directory
USERNAME="USERNAME"
PASSWORD="PWORD"
SERVER="URL-DU-SERVEUR"
 
# remote server directory to upload backup
BACKUPDIR="/My-pi/"

echo "Attempting ftp upload~, ..."

cd $REPERTOIRE
ftp -in $SERVER <<EOMYF
user $USERNAME $PASSWORD
pwd
cd $BACKUPDIR
put $FILE
bye
EOMYF

Lorsque je l’éxécute en ligne de commande (), le serveur reçoit bien le fichier texte.

Le Pi affiche un message de succès (mais si) :

Attempting ftp upload~, ...
257 "/" is the current directory

Donc cette opération est correctement réalisée par la ligne de commande.

Réaliser cette action automatiquement (tâche planifiée)

Nous avons déjà essayé le script à la main avec

cd /home/jf/exec
./send-status.sh OK

Et ça fonctionnait. Maintenant, il faut définir l’environnement d’abord, puis indiquer la commande à exécuter et sa fréquence.

Planifier l’exécution du script

Sur le pi, éditer /etc/crontab avec crontab –e :

Y ajouter à la fin (utiliser SHIFT INS pour coller) :

#env
SHELL=/bin/bash
HOME=/home/jf
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
*/20 * * * * bash /home/jf/exec/send-status.sh OK > /dev/null 2>&1
@reboot  bash /home/jf/exec/send-status.sh REBOOT

Attention : il doit obligatoirement y avoir une ligne vide à la fin de crontab….

Il faut créer une première fois /home/jf/snd/cron.log et lui donner des droits d’accès en écriture (664).

Le crontab ne démarrera pas tant qu’on aura pas fait un reboot, donc

reboot

Remarques sur les cron jobs et leur debogage, sur Pi

Cron Job

Un cron job se déclenche dans un environnement différent de celui d’un lancement manuel !

Dans le script j’ai ajouté printenv, qui affiche toutes les variables d’environnement.

Et en principe on peut envoyer le cron vers un fichier log mais sur le Pi en cours, je n’y arrive pas.

Comme le cronjob fonctionne, ça n’est pas grave.

Le fichier /var/log/syslog contient également beaucoup d’informations sur ce qui se passe dans le pi.

le cron job @reboot

la ligne @reboot bash /home/jf/exec/send-status.sh REBOOT  exécute la tâche lors du reboot du Pi.

Si je reboot le pi ‘pi-name’, le serveur distant reçoit un fichier pi-name-status.txt contenant

pi hostname, time, statut, temperature
pi-name, Sun 2 Apr 17:13:35 CEST 2017, REBOOT, 21.875

Et maintenant

J’ai terminé cette opération. A vous maintenant !

Print Friendly, PDF & Email
5 1 vote
Évaluation de l'article
1
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x