Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/08/2016, à 08:53

abach

Bash : rsync si modification entre la source et la destination.

Bonjour à tous et à toutes,

Mon problème du jour, c'est un script qui me synchronise un dossier de mon PC (Ubuntu) et un espace sur mon site personnel hébergé chez OVH.

Le script, le voici :

#!/bin/sh
clear
source=/media/raspdisk/mediacenter/cameras/*
destination=moi@ftp.moi.fr:www/camip/piwigo/piwigo/galleries
logpath=/media/raspdisk/mediacenter
logstart=$logpath/syncovh_start.log
logend=$logpath/syncovh_end.log
boucle=0

while [ $boucle=0 ]
do
	DATE=`date +"%d/%m/%Y  %H:%M:%S"`
	echo "Transfert vers OVH commencé : $DATE" > $logstart
	rsync -avrz --delete-after -L -e ssh $source $destination
	DATE=`date +"%d/%m/%Y  %H:%M:%S"`
	echo "Transfert vers OVH termie   : $DATE" > $logend
done

Il fonctionne parfaitement et, comme vous l'avez compris, il tourne en boucle en permanence. Pour l'améliorer, je voudrai y inclure une pause s'il n'y a pas de modification entre la source et la destination, histoire de ne pas charger ma connexion réseau inutilement. J'ai pensé à un "ls" récursif envoyé dans un fichier, comparé à un ls récursif au lancement et si la taille diffère, alors on exécute le rsync. Mais là, je bloque, je ne vois pas comment faire.

Si quelqu'un a une idée, je l'en remercie par avance.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#2 Le 23/08/2016, à 01:06

Nairwolf

Re : Bash : rsync si modification entre la source et la destination.

Je ne suis pas sur, mais si tes fichiers ne changent pas, ce qui est envoyé avec ssh, c'est justement....rien, non ?

Par contre, si tu utilises un truc comme 'ls' en comparant la taille, c'est pas une bonne idée. Tu pourrais avoir des cas où la taille reste la meme mais où le contenu diffère. Bon visiblement, ce sont des image que tu déplaces, mais s'il s'agissait d'un fichier texte où tu remplaces une lettre par une autre, le contenu serait différent, mais la taille identique.

Non, je pense qu'il faudrait simplement faire un md5 de l'ensemble de tes fichiers pour voir s'il y a une modification.

Ou alors, tu peux faire ta synchronisation une fois par heure, ou une fois toutes les 30min, par exemple.

Enfin, ce n'est pas très grave, mais l'utilisation de var=`command` n'est plus recommandé. Tu devrais remplacer ça par :

DATE=$(date +"%d/%m/%Y  %H:%M:%S")

tu gagnes en clarté.

Hors ligne

#3 Le 23/08/2016, à 05:57

abach

Re : Bash : rsync si modification entre la source et la destination.

Merci pour ta réponse.
En fait, ce que je transfert, ce sont des images et des vidéos issues de 3 caméras de surveillance. Ces 3 caméras détectent des mouvements ou des niveaux sonores dépassant un certain seuil et, à la survenue de l'un ou l'autre de ces événements, procèdent à des enregistrements. Ces enregistrements sont envoyés sur mon PC via FTP.
De là, pour diverses raisons, je veux les mirorrer vers un espace sur mon site Internet hébergé chez OVH.
La difficulté, c'est que, par moment j'ai de très nombreuses détection (la journée) et qu'à d'autres (la nuit) quasiment aucun. Donc, la journée, il faut parfois un temps pas possible pour faire le transfert FTP vers OVH et la nuit, c'est inutile de les enchainer directement. D'où mon idée de faire une boucle infinie, évitant de faire un cron qui, dans certains cas, va lancer une tâche avant même que la précédente ne soit terminée, en faisant un test qui permettrait de faire un sleep si il n'y a pas de changements.

J'ai bossé là dessus de mon coté et j'ai trouvé cette solution :

#!/bin/sh
clear
source=/media/raspdisk/mediacenter/cameras
destsrv=moi@ftp.moi.fr
destpath=www/camip/piwigo/piwigo/galleries
destination=$destsrv:$destpath
logpath=/media/raspdisk/mediacenter
logstart=$logpath/syncovh_start.log
logend=$logpath/syncovh_end.log
boucle=0
resultat=0

while [ $boucle=0 ]
do
DATE=`date +"%d/%m/%Y  %H:%M:%S"`
echo "Boucle commencée            : $DATE" > $logstart
echo "Source      : $source"
echo "Destination : $destination"
ls $source -AlLRF | grep -v '/$'| wc -l > ./sourcesize
ssh $destsrv "ls $destpath -AlLRF | grep -v '/$'| wc -l" > ./destsize
cmp ./sourcesize ./destsize > $resultat

if [ $resultat -ne 0 ]
then
	echo "Rien à transférer"
	sleep 1000
else
	echo "transfert vers OVH"
	DATE=`date +"%d/%m/%Y  %H:%M:%S"`
	echo "Transfert vers OVH commencé : $DATE" >> $logstart
	rsync -avrz --delete-after -L -e ssh $source/* $destination
	DATE=`date +"%d/%m/%Y  %H:%M:%S"`
	echo "Transfert vers OVH terminé  : $DATE" > $logend
fi
DATE=`date +"%d/%m/%Y  %H:%M:%S"`
echo "Boucle terminée             : $DATE" >> $logend
done

Pour info, dans ma source, j'ai un lien symbolique que je dois aussi explorer d'où la présence de certaines options spécifique pour cela dans mon ls et dans mon rsync.
De plus, je sais parfaitement que mon codage est fait "à la one again", sans commentaire et avec des indentations plus que légères mais ça, je vais m'en occuper maintenant que ça semble fonctionner.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#4 Le 23/08/2016, à 13:58

droopy191

Re : Bash : rsync si modification entre la source et la destination.

Salut,

Je ne maitrise pas la mise en oeuvre mais j'ai vu de nombreux logiciels utiliser inotify pour monitorer ce genre de chose. L'idée est de suivre les événements sur le système de fichier et de déclencher un script à partir de cela.

Vous pourriez soit déclencher votre script sur cette base ou meme limiter le rsync au fichier ajouté.

Hors ligne

#5 Le 23/08/2016, à 14:22

abach

Re : Bash : rsync si modification entre la source et la destination.

Salut droopy191,

J'ai jeté un oeil à inotify grâce à ton message. Le gros souci que j'y vois, c'est qu'il se contente de surveiller le dossier source, sans faire la comparaison avec le dossier destination. Si, pour une raison quelconque, un truc a été modifié sur la destination, il ne le verra pas et n'en fera donc pas le miroir.

Comme j'accède aussi à ma destination via sshfs, je peux très bien effacer des fichiers là bas par erreur...


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#6 Le 23/08/2016, à 14:47

Nairwolf

Re : Bash : rsync si modification entre la source et la destination.

Ce n'est pas préférable d'avoir seulement des droits de lecture sur le dossier destination ? Comme cela, pas de risque d'avoir des fichiers effacés par erreurs !

Hors ligne

#7 Le 23/08/2016, à 14:51

abach

Re : Bash : rsync si modification entre la source et la destination.

Nairwolf a écrit :

Ce n'est pas préférable d'avoir seulement des droits de lecture sur le dossier destination ? Comme cela, pas de risque d'avoir des fichiers effacés par erreurs !

Heu, je comprend pas tout. Dans le dossier destination, je veux y copier la source, en miroir. Si je n'ai que les droits de lecture, je fais comment pour y écrire ?


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#8 Le 23/08/2016, à 15:09

Nairwolf

Re : Bash : rsync si modification entre la source et la destination.

Je me suis peut-être mal exprimé.

Le dossier destination doit effectivement avoir les droits d'écriture pour pouvoir copier les fichiers. Par contre, les fichiers en eux-même seraient en lecture seule. Les fichiers en eux-même ne sont pas modifié individuellement ? Si ?

Hors ligne

#9 Le 23/08/2016, à 15:27

abach

Re : Bash : rsync si modification entre la source et la destination.

Désolé, mais je ne suis toujours pas d'accord.
En effet, je fais un miroir, pas un ajout. Comme les fichiers proviennent de caméras de surveillance, il est évident qu'au bout d'un certain temps, je vais vouloir faire des purges. Ces purges, je vais les faire ici, en local, et c'est rsync qui va les propager sur mon hébergement distant. Si, là bas, mes fichiers sont en lecture seule, je ne pourrai pas les supprimer...


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#10 Le 23/08/2016, à 16:13

droopy191

Re : Bash : rsync si modification entre la source et la destination.

abach a écrit :

Salut droopy191,

J'ai jeté un oeil à inotify grâce à ton message. Le gros souci que j'y vois, c'est qu'il se contente de surveiller le dossier source, sans faire la comparaison avec le dossier destination. Si, pour une raison quelconque, un truc a été modifié sur la destination, il ne le verra pas et n'en fera donc pas le miroir.

Comme j'accède aussi à ma destination via sshfs, je peux très bien effacer des fichiers là bas par erreur...

Par sur d'avoir bien compris votre besoin.
Le déclenchement principal semble etre la création d'une nouvelle image sur le serveur local.
Si vous voulez aussi détecter la suppression d'un fichier distant et le renvoyer, je ne vois pas comment faire sans une vérification périodique ( cron) ou un script déclenché sur le serveur distant.

Votre besoin semblait unidirectionnel, mais sinon éventuellement voir les  systèmes de de fichiers répliqués qui permettent cette notion de miroir.

Hors ligne

#11 Le 23/08/2016, à 18:13

abach

Re : Bash : rsync si modification entre la source et la destination.

droopy191,
mon besoin est effectivement unidirectionnel. Mais je ne peux pas exclure que, pour une raison quelconque (perte de connexion en cours de transfert par exemple) un fichier envoyé ne le soit que partiellement. Rsync, justement permet de voir l'incohérence dans le transfert de ce fichier et de le renvoyer.
La vérification, sauf erreur de ma part, est faite par la commande rsync.
Le cron ne me semble pas adapté car je ne connais pas, à priori, le volume et donc la durée du transfert. Si, pour une raison quelconque, il n'y a pas de transfert pendant plusieurs jours, ce transfert va prendre un temps phénoménal et aucun autre ne pourra être déclenché tant que le 1er n'est pas terminé.
C'est pour ça que j'ai opté pour une boucle infinie. En effet, si le transfert s'interrompt, aucun autre ne reprend. Un transfert ne peut pas non plus commencer tant que le transfert en cours n'est pas terminé.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#12 Le 23/08/2016, à 19:10

droopy191

Re : Bash : rsync si modification entre la source et la destination.

abach a écrit :

droopy191,
Le cron ne me semble pas adapté car je ne connais pas, à priori, le volume et donc la durée du transfert. Si, pour une raison quelconque, il n'y a pas de transfert pendant plusieurs jours, ce transfert va prendre un temps phénoménal et aucun autre ne pourra être déclenché tant que le 1er n'est pas terminé.
C'est pour ça que j'ai opté pour une boucle infinie. En effet, si le transfert s'interrompt, aucun autre ne reprend. Un transfert ne peut pas non plus commencer tant que le transfert en cours n'est pas terminé.

Je me garderais de faire des recommandations définitives en programmation wink
Mais l'approche inotify me parait adaptée, l’événement déclencheur de la synchro étant la création d'une nouvelle image par la webcam.
Le cron marche aussi très bien avec la condition ci dessous, valable de toute facon pour les 2 approches.

Vous créez un fichier PID pour gérer le script en cours.
Au prochain déclenchement du script par cron, vous testez l'existence du PID file, si c'est non, le script s’arrête jusqu'au prochaine appel par cron.

Dernière modification par droopy191 (Le 23/08/2016, à 19:11)

Hors ligne

#13 Le 23/08/2016, à 20:01

abach

Re : Bash : rsync si modification entre la source et la destination.

avec le test du PID, je suis d'accord avec toi, c'est effectivement une piste à étudier wink

Pour l'instant, ça fonctionne comme ça et je n'ai pas le temps d'aller plus loin. J'ai un autre gros souci à régler au niveau de mon site. J'y ai en effet installé piwigo pour gérer la galerie. Ca marche impeccablement pour les photos mais les vidéos ne sont pas lisibles...

Suite au prochain épisode smile


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne