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 23/02/2010, à 16:58

fabitux

[RESOLU] script avec condition sur existence de nouveaux fichiers

Bonjour,

Objectif :
- synchroniser un répertoire local avec un répertoire distant
- uniquement si des nouveaux fichiers sont apparus dans le répertoire local // ou uniquement si un fichier datant de moins de XX minutes est présent.

Contrainte (déjà réglée) :
- comme j'appelle ce script toutes les 2 minutes par cron (/etc/crontab), je dois introduire une condition pour éviter que 2 instances du script ne soient lancées simultanément : j'ai utilisé une méthode simple pour cela, trouvée sur : http://www.bash-hackers.org/wiki/doku.php/howto/mutex (la méthode crée un répertoire temporaire /var/lock/my/lock qui est effacé une fois le script terminé ; tant qu'il n'est pas supprimé, ça veut dire que le script est en cours, et donc il ne lance pas une nouvelle instance)

Voici la chose pour le moment :

#!/bin/sh
# Test si script est déjà lancé 
if mkdir /var/lock/mylock; then
        echo "OK" >&2
        export RSYNC_PASSWORD=XXXXXXXXXX
        rsync -r -z -t -v --delete /mon_dossier_à_synchroniser/ mon_site_distant
        rmdir /var/lock/mylock
else
        echo "rsync en cours" >&2
        exit 1
fi

Ce que je ne sais pas faire, c'est ajouter une condition pour que la commande rsync ne soit lancée QUE si un nouveau fichier est apparu dans le répertoire OU les sous-répertoires, ou, éventuellement, QUE si un fichier qui date de moins de XX minutes est dans le répertoire OU les sous-répertoire...

Vous vous doutez que je ne suis pas très expert en script, mais c'est rigolo !
Merci par avance pour votre aide
à+ / fabitux

Dernière modification par fabitux (Le 02/03/2010, à 04:40)


-------- ubuntu 11.10

Hors ligne

#2 Le 23/02/2010, à 17:03

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Utilise inotifywait wink
Ya des examples sur le forum sinon ici : http://www.sputnick-area.net/scripts/cups2freefax/fax4free_inotify.bash
Ca permet de ne lancer une action uniquement si une action surveiilée apparait.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#3 Le 23/02/2010, à 17:20

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

merci pour la réponse sputnick

En fait, le script sera lancé sur un serveur NAS qui tourne sous linux, mais sur lequel je n'ai pas accès à la commande inotifywalt.
Dommage, car ça semblait pas mal.

Pas accès non plus (sauf erreur de ma part) à "incrontab" dont on parle ici http://forum.ubuntu-fr.org/viewtopic.php?id=368959
à part ça, le serveur NAS est un linux à peu près normal ;-)

à+ / fabitux

Dernière modification par fabitux (Le 23/02/2010, à 17:20)


-------- ubuntu 11.10

Hors ligne

#4 Le 23/02/2010, à 19:10

AnsuzPeorth

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

fabitux a écrit :

Contrainte (déjà réglée) :
- comme j'appelle ce script toutes les 2 minutes par cron (/etc/crontab), je dois introduire une condition pour éviter que 2 instances du script ne soient lancées simultanément : j'ai utilisé une méthode simple pour cela, trouvée sur : http://www.bash-hackers.org/wiki/doku.php/howto/mutex (la méthode crée un répertoire temporaire /var/lock/my/lock qui est effacé une fois le script terminé ; tant qu'il n'est pas supprimé, ça veut dire que le script est en cours, et donc il ne lance pas une nouvelle instance)

Tu aurais aussi pu utilser la commande pidof ou pgrep pour savoir si le processus rsync était en cours.

fabitux a écrit :

Ce que je ne sais pas faire, c'est ajouter une condition pour que la commande rsync ne soit lancée QUE si un nouveau fichier est apparu dans le répertoire OU les sous-répertoires, ou, éventuellement, QUE si un fichier qui date de moins de XX minutes est dans le répertoire OU les sous-répertoire...

Si tu ne peux pas installer inotify sur ton serveur, peut être qu'en faisant une liste de base et une autre liste à chaque lancement (find doit t'offrir toutes les options nécessaires), il suffit ensuite de comparer (diff) pour savoir si il y a du nouveau.

Moins pratique que inotify, mais bon, faute de grives, on se contentera de merles.

C'est une solution, il doit en avoir d'autres ! (comme tjrs)

ps: A la place de crontab, tu aurais pu faire un script avec un sleep dedans lancé en daemon, vu que tu tournes toutes les 2 mn....


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 23/02/2010, à 19:16

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

AnsuzPeorth a écrit :

Tu aurais aussi pu utilser la commande pidof ou pgrep pour savoir si le processus rsync était en cours.

Il utilise une méthode propre et éprouvée, lui conseille pas de se contenter de merles wink


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#6 Le 23/02/2010, à 19:25

AnsuzPeorth

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

sputnick a écrit :

Il utilise une méthode propre et éprouvée, lui conseille pas de se contenter de merles wink

pidof et pgrep ne sont pas des commandes propres et éprouvées ???? (je pensais justement !)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#7 Le 23/02/2010, à 19:55

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Je parle de methode de lock.

pgrep rsync

c'est quand même pas top pour un lock.
Il peux y avoir d'autres rsync sur le systeme.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#8 Le 25/02/2010, à 05:02

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

salut,
find avec diff a l'air d'être une solution, en effet.
Mais je ne connais pas la syntaxe des scripts... (les if ; then ;  else....)

Est-ce que quelqu'un saurait écrire un début de script sur la base du premier script en haut du post (je m'arrangerais pour les options des commandes find et diff) ?

à+ / fabitux


-------- ubuntu 11.10

Hors ligne

#9 Le 25/02/2010, à 11:36

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

rsync -avn <SOURCE> <CIBLE>

te donnera la liste des fichiers modifiés sans les synchroniser.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#10 Le 26/02/2010, à 13:39

cedric.amouyal

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Tu as la commande find qui te permets ce genre de chose: cela te liste les fichier qui ont été modifié il y a
-mmin n
    Fichier dont les données ont été modifiées il y a n minutes.
-mtime n
    Fichier dont les données ont été modifiées il y a n*24 heures.

exemple:

find . -mmin 1

Tu pourrais faire quelquechose du genre

nb=`find  /mon_dossier_à_synchroniser/ -mmin 1|wc -l`
if ( $nb > 0 )
then
...
fi

@+ced

Hors ligne

#11 Le 26/02/2010, à 20:05

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

fabitux a écrit :

Ce que je ne sais pas faire, c'est ajouter une condition pour que la commande rsync ne soit lancée QUE si un nouveau fichier est apparu dans le répertoire OU les sous-répertoires, ou, éventuellement, QUE si un fichier qui date de moins de XX minutes est dans le répertoire OU les sous-répertoire...

Ben pourquoi se casser la tete ? Si ya rien à synchroniser, rsync ne synchronisera rien, si ya qq chose il synchronisera. Pas plus compliqué que ça. Ca me semble la méthode la plus adapté si tu ne peux pas utiliser inotifywait.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#12 Le 28/02/2010, à 05:58

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

salut,
D'après les infos de Cédric, j'ai ce script :

#!/bin/sh                               

nb=`find /mon_rep_a_senchroniser/ -mmin 1|wc -l`
                                       
# Test si deja lance par le meme utilisateur                                   
if mkdir /var/lock/mylock; then    
# Test si repertoire modifié récemment                                            
        if ( $nb > 0 )
	then
	        echo "OK" >&2                                                          
	        export RSYNC_PASSWORD=XXXXXXXX                                          
	        rsync -r -z -t -v --delete /mon_rep_a_synchroniser/ mon_rep_distant
	        rmdir /var/lock/mylock                                                 
	fi
else                                                                           
        echo "rsync en cours" >&2                                              
        exit 1                                                                 
fi

Quand j'exécute, il me dit :

script.sh: 17: 0: not found

(la ligne 17 est la dernière ligne "fi"

Un problème de syntaxe ??

@sputnick : c'est vrai que s'il n'y a pas de fichiers synchronisés, rsync ne synchronise rien, mais rsync consomme quand même de la bande passante inutile. Sachant que je lance le script toutes les 2 minutes via crontab, autant ne le faire que quand c'est utile !

à+ / fabitux


-------- ubuntu 11.10

Hors ligne

#13 Le 28/02/2010, à 06:44

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

fabitux a écrit :

Un problème de syntaxe ??

Oui, il faut utiliser les doubles parenthèses pour des évaluations arithmétiques.

fabitux a écrit :

@sputnick : c'est vrai que s'il n'y a pas de fichiers synchronisés, rsync ne synchronise rien, mais rsync consomme quand même de la bande passante inutile. Sachant que je lance le script toutes les 2 minutes via crontab, autant ne le faire que quand c'est utile !

à+ / fabitux

Ben nan, si ya rien à synchroniser, ya pas d'utilisation de bande passante. Elle sera utilisée que si il y a qq chose à synchroniser.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#14 Le 01/03/2010, à 17:36

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

salut Sputnick,

Peux-tu être plus clair pour es doubles parenthèses : car j'ai testé avec (( )) ou avec { } etc et ça ne marche pas...
Désolé, mais je suis vraiment une bille en langage script..

Concernant rsync, ça m'étonne : pour vérifier qu'il n'y a rien à synchroniser, il faut bien que rsync fasse une requête sur le serveur distant ?!

à+ / fabitux


-------- ubuntu 11.10

Hors ligne

#15 Le 01/03/2010, à 18:59

kyncani

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

if test `find /quelque/part -mmin -1 | wc -l` -gt 0; then
    echo Quelque chose a change la derniere minute
fi

C'est quand même pas terrible parce qu'il est possible que quelque chose ait changé il y a cinq minutes sans être synchronisé pour une raison ou une autre.

Hors ligne

#16 Le 01/03/2010, à 19:10

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Ca marche pas

"c'est un peu court jeune homme" comme disait Cyrano. Le bash c'est comme les langages de programmation, on improvise pas comme ça des syntaxes imaginaires. Ya des règles. Pour le b-a-ba, http://mywiki.wooledge.org/ArithmeticExpression ou en Français cherche abs+traduc+bash sur google.  Pour rsync, bien sur qu'une "requête" passe par le réseau, mais c'est juste pour dire à rsync

wesh gros, salut bien trankill la mifa toussa ? Hé rsync, ya moyen que tu check les nouveaux fichiers pour me pondre un liste t'a vu, t'assure t'es mon sausse, cimer la mifa.

mais il ne passe sur le réseau que l'ordre. rsync fait des vérifications à base de dates et de md5, donc cela ne congestionne pas le réseau, mais ça peux fera monter la consommation de CPU sur la machine qui héberge les fichers, surtout si le CPU est limite ou que le nombre de "tasks" ( taches ) est élevé ( load ). De plus, c'est comme ça qu'on fait "en prod" ( dans le milieu pro ) pour synchroniser.


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#17 Le 02/03/2010, à 01:34

nesthib

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

[HS] tiens sputnick tant que j'y pense ton bot de signature déconne quand il y a des accents, ça coupe la phrase [/HS]


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#18 Le 02/03/2010, à 03:18

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

[HS] Résolu, des changements d'encodage sur le site récemment ? Il me semblait que ça passait nickel avant. [/HS]


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#19 Le 02/03/2010, à 04:39

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

kyncani a écrit :

C'est quand même pas terrible parce qu'il est possible que quelque chose ait changé il y a cinq minutes sans être synchronisé pour une raison ou une autre.

Merci Kyncani,
Ca y est, mon script fait ce que je veux !

Par contre, je ne comprends pas ta remarque : n'oublie pas que le script est lancé récursivement toutes les 2 minutes. Donc, s'il y a une synchro qui rate, ce sera la suivante qui resynchronisera tout le répertoire.

Merci à tous !
Je passe en résolu
à+ / fabitux


-------- ubuntu 11.10

Hors ligne

#20 Le 02/03/2010, à 07:25

kyncani

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Tu lances la synchro si un fichier a changé il y a moins de X secondes.

Donc, si un fichier a changé il y a plus de X secondes mais que toutes les synchros associées ont échouées, ce fichier sera ignoré pour ce qui est de lancer une nouvelle synchro ad vitam eternam.

Exemple, un fichier est modifié à 15H00 mais le réseau était coupé jusqu'à 16H00. Le fichier, bien que modifié, est maintenant trop vieux pour déclencher une synchronisation.

Hors ligne

#21 Le 02/03/2010, à 16:11

fabitux

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

kyncani a écrit :

Tu lances la synchro si un fichier a changé il y a moins de X secondes.

Donc, si un fichier a changé il y a plus de X secondes mais que toutes les synchros associées ont échouées, ce fichier sera ignoré pour ce qui est de lancer une nouvelle synchro ad vitam eternam.

Exemple, un fichier est modifié à 15H00 mais le réseau était coupé jusqu'à 16H00. Le fichier, bien que modifié, est maintenant trop vieux pour déclencher une synchronisation.

Exact, bien vu !!
Du coup, j'ai ajouté le même script, mais sans condition sur les fichiers modifiés, que je lance toutes les heures !!
Merci pour tout !


-------- ubuntu 11.10

Hors ligne

#22 Le 02/03/2010, à 19:15

sputnick

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Hééé ben tout ça pour ça big_smile Le môssieur c'est 'kes qui te disait depuis le debut sacrebleu... tongue


Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr

Hors ligne

#23 Le 02/03/2010, à 20:38

kyncani

Re : [RESOLU] script avec condition sur existence de nouveaux fichiers

Comme quoi faut pas trop se prendre le choux smile

Hors ligne