logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 04-04-2017 04:36:36

Walker29
Membre
Lieu : Bretagne (Finistère)
Distrib. : Debian 9.2 (Stretch)
Noyau : Linux 4.13.0-0.bpo.1-amd64
(G)UI : Xfce 4.12
Inscription : 23-04-2016

[RESOLU] - Boucle while et rsync ???

Bonsoir à toutes et à tous,

Ma question va peut-être vous paraître nulle, mais je suis débutant en Bash (2 semaines d'XP hmm)... Mon problème est le suivant, je cherche a réaliser un script qui me permettrait de faire une sauvegarde automatisé avec "rsync",  via un fichier texte "rsync-user.lst" contenant les chemins d'accès d'une sélection de répertoires préalablement remplit. Pour ce faire j'ai pensé à faire une boucle afin de traiter le fichier ligne par ligne et insérer les chemins d'accès dans une variable.

Mon script fonctionne mais aucune synchronisation entre mes deux répertoires "source/destination" ne se fait. Après quelques recherches, j'ai essayé de faire tournée la commande en tâche de fond avec "&" et d'insérer un "wait $!", mais rien n'y fait... Voici la fonction que j'ai écrit (je sais c'est nul et pas propre sos.gif) :

function RsyncW()
{ ## Traitement des répertoires à synchroniser
  # Début de la boucle
while read ligne
  do
    Count=$((++Count))    # Incrémentation
    # Captation de la date et l'heure
        MyDate=$(date +%d/%m/%Y)
  MyTime=$(date +%H:%M:%S)
   
# Copie les fichiers de la source vers la destination
    rsync -a -v $line $DestW &    # Lancement en arrière plan
    Sortie=$?
    wait $!
 
    # Test le retour de 'rsync'
    if [ $Sortie = 0 ]; then
 
    # Affichage écran
    clear
    echo -e "[$MyDate-$MyTime]\n"
    echo -e "--> Sources\t: \033[1;34m$ligne\033[0;0m"
    echo -e "--> Destination\t: \033[1;34m$DestW\033[0;0m\n"
    echo -e "\033[1;32m--> Opération réussie !\033[0;0m\n"
    echo -e "Sortie de 'cp' : $Sortie"
    else
 
    # Affichage écran
    clear
    echo -e "[$MyDate-$MyTime]\n"
    echo -e "--> Sources\t: \033[1;34m$ligne\033[0;0m"
    echo -e "--> Destination\t: \033[1;34m$DestW\033[0;0m\n"
    echo -e "\033[1;31m--> Opération échouée !\033[0;0m\n"
    echo -e "Sortie de 'cp' : $Sortie"
    exit 1
  fi
    # Fin de la boucle
  done < /home/$USER/wlk-tools/.lst/rsync-user.lst    # Fichier à lire
}



Hônnetement je suis peut-être gland ? Mais je ne vois pas du tout où est mon erreur dans cette fonction, surtout qu'elle fonctionne parfaitement et affiche bien les bons chemins d'accès. Mais elle ne fait pas ce pour quoi elle est programmée, c'est rageant ! crash.gif

Une petite explication sur le pourquoi du comment serait bienvenue, car je sèche... Merci par avance
Cordialement

Dernière modification par Walker29 (05-04-2017 07:23:27)


- La logique vous conduira d'un point A à un point B, l'imagination et l'audace vous conduiront où vous le désirez ! (A. Einstein)
- Quelle époque terrible que celle ou des idiots dirigent des aveugles ! (W. Shakespeare)
- Si vous ne faites pas aujourd'hui ce que vous avez dans la tête, demain vous l'aurez dans le c... (Coluche) big_smile

Hors ligne

#2 04-04-2017 09:36:28

kyodev
Banni(e)
Lieu : Lyon
Distrib. : Debian
Noyau : probablement stretch
(G)UI : variable selon l'humeur de naguam
Inscription : 18-08-2013

Re : [RESOLU] - Boucle while et rsync ???

bonjour
ton script a l'air très beau, mais...
de ce que je comprends, tu programmes quelque chose déjà intégré à rsync, et je ne suis pas certain que l'on voit le retour des erreurs, car il il y forcément des erreurs si cela ne fonctionne pas.

ou tu utilises cp pour chaque ligne de ton fichier, avec un affichage des erreurs
ou tu utilises rsync en 1 seule commande même si elle est longue (à mettre dans un script pour la stocker)

regarde les tutos rsync, ou pour commencer

man rsync      #the rtfm
h       #pour voir l'aide de man
q       #pour quitter l'aide
/list       #pour faire une recherche sur le motif "list"
q       #pour quitter man

tu devrais comprendre où je veux en venir ;)


[mode aéré]

Hors ligne

#3 04-04-2017 12:43:16

Walker29
Membre
Lieu : Bretagne (Finistère)
Distrib. : Debian 9.2 (Stretch)
Noyau : Linux 4.13.0-0.bpo.1-amd64
(G)UI : Xfce 4.12
Inscription : 23-04-2016

Re : [RESOLU] - Boucle while et rsync ???

Bonjour Kyodev et merci pour ta réponse !

Du coup si j'ai bien compris ta réponse, je réinvente la roue en quelque sorte... scratchhead.gif
Je croyais qu'il y avait une erreur dans mon code mais visiblement ce n'est pas le cas, c'est juste un double emploi avec les fonctions de "rsync", je suis bon pour me faire une ligne de commande longue comme un jour sans pain, "--filter + et --filter -"... woohoo.gif

Mais du coup ta réponse me rassure car j'étais à deux doigts de finir chèvre... J'ai vraiment pensé que j'étais idiot !!!
Dans le pire des cas je ferai du ligne par ligne avec "cp -a -r".

Dès que j'aurai la solution je vous en informerai, on ne sait jamais peut-être que ce sera utile à quelqu'un dans un futur proche.

Cordialement

- La logique vous conduira d'un point A à un point B, l'imagination et l'audace vous conduiront où vous le désirez ! (A. Einstein)
- Quelle époque terrible que celle ou des idiots dirigent des aveugles ! (W. Shakespeare)
- Si vous ne faites pas aujourd'hui ce que vous avez dans la tête, demain vous l'aurez dans le c... (Coluche) big_smile

Hors ligne

#4 04-04-2017 16:01:56

Severian
Membre
Distrib. : Debian GNU/Linux 9.4 (stretch)
Noyau : Linux 4.14.0-0.bpo.3-amd64
(G)UI : Openbox 3.6.1-4
Inscription : 13-12-2014

Re : [RESOLU] - Boucle while et rsync ???

bonsoir
pour les filtres rsync, tu peux utiliser la commande -F
tu te créé un fichier .rsync-filter   dans lequel tu met les fichiers / dossiers que tu veux filtrer
petit exemple

- .iso
- .tmp
- lost+found/
- .Trash/
- .cache/
- .thumbnails/
- .dbus
- .local/share/Trash
- Modèles
- Desktop
- VirtualBox VMs
- .local/share/gvfs-metadata/
- .mozilla
- .tor-browser_fr/


le fichier est placé dans mon /home/user/

ça réduit la commande tongue

Hors ligne

#5 04-04-2017 18:13:27

kyodev
Banni(e)
Lieu : Lyon
Distrib. : Debian
Noyau : probablement stretch
(G)UI : variable selon l'humeur de naguam
Inscription : 18-08-2013

Re : [RESOLU] - Boucle while et rsync ???

ou un fichier list des répertoires à synchroniser, c'est dans un texte, facilement visible et maintenable
Walker29 l'a déjà fait... c'est vrai qu'il aime bien réinventé la roue wink

lit bien le man, tu peux en faire des choses avec rsync, avec aussi des archivages historisés, mais je ne connais pas le but de ton script

[mode aéré]

Hors ligne

#6 04-04-2017 18:41:16

otyugh
CA Debian-Facile
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016
Site Web

Re : [RESOLU] - Boucle while et rsync ???

Walker29 a écrit :

Je croyais qu'il y avait une erreur dans mon code mais visiblement ce n'est pas le cas, c'est juste un double emploi avec les fonctions de "rsync"


Si ça marche pas, bien entendu qu'il y a une faute dans ton script. Rien n'interdit de réinventer la poudre au fond x)
Y a des moyens de debug de script :

bash -x monscript.bash



Plus bêtement remplacer le truc important (ta commande rsync ici) par un "echo <commande rsync qui semble merder>" fera que tu verra ce qu'il essaye de faire (ou pas) et de corriger simplement. Si le problème venait de là.

Dernière modification par otyugh (04-04-2017 18:48:26)


virtue_signaling.pngpalestine.png

Hors ligne

#7 04-04-2017 21:18:56

Walker29
Membre
Lieu : Bretagne (Finistère)
Distrib. : Debian 9.2 (Stretch)
Noyau : Linux 4.13.0-0.bpo.1-amd64
(G)UI : Xfce 4.12
Inscription : 23-04-2016

Re : [RESOLU] - Boucle while et rsync ???

Bonsoir à tous smile

Tout d'abord merci pour vos réponses qui m'inspirent... Je vais procéder par ordre !

Pour "kyodev" : Le but de mon script n'a rien de compliqué en soit, il s'agit  de faire une sauvegarde/synchronisation à chaque déconnexion d'un utilisateur sur support USB de leur répertoire "/home/$USER", mais de ne sauvegarder/synchroniser que quelques répertoires précis (càd : exclure la major partie des dossiers cachés comme "./cache et ./thumbnails"...) et ensuite d'afficher le résultat sous forme d'un rapport "rsync-user.log" en fin d'opération.

1 - Il test la présence du support USB (ici une clé usb contenant deux partitions. Une de 2Go avec une image live de Debian, et l'autre de 14Go formatée en ext4 pour la sauvegarde des données user. J'ai fait ce choix car les partitions FAT32 ou NTFS ne prennent pas en compte les droits et autres et c'est plus simple... scratchhead.gif)
2 - Exécuter la sauvegarde/synchronisation en arrière plan, puis sort du script.

Rien de bien complexe en sur le papier ! Sauf que j'ai failli fumer de la casquette... lol

Pour "Severian" : Je connais le principe et la synthaxe des filtres, mais la chose à laquelle je n'avais pas pensé, c'est de mettre en fichier texte les répertoires à exclure, en effet c'est plus simple de cette façon et facilement modifiable en plus... Cela donnerai un truc du genre :

rsync -av --progress -l -s --filter -/dossiers ou fichiers à exclure /media/user/cléUSB


en plaçant les "--filter" dans un fichier. Moi je restais borné à mettre dans un fichier les répertoires à prendre en compte et de faire une boucle avec tout çà ! Mais le problèmes c'est que la commande "rsync" digère mal cette méthode. Je pense utiliser ta technique du coup, merci pour çà... woohoo.gif

Pour "otyugh" : Un grand merci pour ta commande de débogage que je ne connaissait pas ! J'avais vu que l'on pouvait exécuter un script, même si le fichier n'était pas exécutable avec la commande suivante :

bash NomDuScript.sh


Mais je n'avais pas encore approfondis la question. Je mets le code, on ne sait jamais, mais cela pourrai intéresser un nouveau en script shell comme moi tongue.

Pour conclure : Un grand merci à vous d'avoir pris de votre temps pour aider un nouveau, du coup cela m'a redonné le moral et je ressort de la lecture de ce poste reboosté pour affronter cette fonction (que je ne pouvais plus voir en peinture kernal_panic.gif). Je test tout cela et si j'arrive à rendre le script exploitable sur toutes les installations "normales" je le posterai à la suite de ce fil.

Bonne fin de soirée à tous !
Cordialement


- La logique vous conduira d'un point A à un point B, l'imagination et l'audace vous conduiront où vous le désirez ! (A. Einstein)
- Quelle époque terrible que celle ou des idiots dirigent des aveugles ! (W. Shakespeare)
- Si vous ne faites pas aujourd'hui ce que vous avez dans la tête, demain vous l'aurez dans le c... (Coluche) big_smile

Hors ligne

#8 05-04-2017 07:21:35

Walker29
Membre
Lieu : Bretagne (Finistère)
Distrib. : Debian 9.2 (Stretch)
Noyau : Linux 4.13.0-0.bpo.1-amd64
(G)UI : Xfce 4.12
Inscription : 23-04-2016

Re : [RESOLU] - Boucle while et rsync ???

Bonjour à tous,

Voilà, j'ai passé ma nuit sur cette fonction, mais après des heures de recherches et de lectures, 3 cafetières pleines, et aussi grâce à ma bible : "Linux en concentré"  (1113 pages tout de même) j'ai finalement  réussi à pondre ces quelques lignes woohoo.gif :

function RsyncW()
{ ## Traitement des répertoires à synchroniser
  # Variable contenant les filtres pour 'rsync'
rsyncfolders=".cache|.dbus|.gconf|.gnupg|.gstreamer-0.10|.local|.mozilla|.pki|.thumbnails|.bash_history|.bash_logout|.dmrc|.ICEauthority|.profile|.Xauthority|.xsession-errors|.xsession-errors.old"
listfolder="wlk-tools/.lst"   # Répertoire de la liste des filtres

# Test la présence du fichier 'rsync-$USER' et suppression
if [ -f "$HOME/rsync-$USER.lst" ]; then
  rm $HOME/rsync-$USER.lst
fi

# Nettoyage de l'écran
clear

# Création de la liste des fichiers et répertoires des $HOME
ls -1ABSX $HOME > /tmp/$USER

# Exctraction des dossiers et fichiers non souhaités
# et création du fichier 'rsync-$USER.lst'
egrep $rsyncfolders /tmp/$USER > $HOME/$listfolder/rsync-$USER.lst

# Effacer le fichier temporaire
rm /tmp/$USER

# Création du fichier filtre
while read line
  do
  maLigne1=$(echo --filter '"' -/)
  maLigne2=$(echo $line'"')
  echo $maLigne1$maLigne2 >> /tmp/rsync$USER      # Création du fichier filtre (tmp)
  done < $HOME/$listfolder/rsync-$USER.lst      # Fichier à lire

# Tri alphabétique et suppression du fichier filtre (rsync)
sort /tmp/rsync$USER -o $HOME/$listfolder/rsync-$USER.lst && rm /tmp/rsync$USER

# Mise en forme du fichier filtre (rsync)
while read line
  do
  filters="$filters $line"
  done < $HOME/$listfolder/rsync-$USER.lst

# Lancement de 'rsync' avec les filtres, en mode archivage et compression des données
rsync -a -v -z --progress -l -s $(filters) /home/$USER/ /media/$USER/wlk-save-01/backup/$USER/
}



J'espère que mon script ne parait pas trop barbare pour les "maestro", mais j'ai vraiment essayé de le faire le plus léger possible ! Du coup si vous en avez le courage, le temps et la patience, j'aimerais bien avoir vos avis et/ou suggestions en vue d'améliorations possibles (ce dont je ne doute pas vu mon niveau... tongue). Toute vos remarques seront les bienvenues !
J'ai volontairement laissé tous les commentaires afin que les personnes comme moi puissent y comprendre quelque chose. Merci par avance, et bonne journée

P.S. : merci.gif à ceux qui m'ont bien aidés sur ce coup en me fournissant de quoi orienter mes recherches et de bons tuyaux... Chapeaux bas messieurs !

Cordialement

Dernière modification par Walker29 (05-04-2017 07:31:07)


- La logique vous conduira d'un point A à un point B, l'imagination et l'audace vous conduiront où vous le désirez ! (A. Einstein)
- Quelle époque terrible que celle ou des idiots dirigent des aveugles ! (W. Shakespeare)
- Si vous ne faites pas aujourd'hui ce que vous avez dans la tête, demain vous l'aurez dans le c... (Coluche) big_smile

Hors ligne

#9 05-04-2017 15:50:23

kyodev
Banni(e)
Lieu : Lyon
Distrib. : Debian
Noyau : probablement stretch
(G)UI : variable selon l'humeur de naguam
Inscription : 18-08-2013

Re : [RESOLU] - Boucle while et rsync ???

tous les commentaires afin que les personnes comme moi

non, les commentaires sont signe de qualité au contraire. certains devs ré-ecrivent leur code en supprimant les lignes de code et en ré-écrivant en fonction des commentaires...
pour ton code, dsl, je suis plus dans la course


[mode aéré]

Hors ligne

#10 06-04-2017 08:37:39

Walker29
Membre
Lieu : Bretagne (Finistère)
Distrib. : Debian 9.2 (Stretch)
Noyau : Linux 4.13.0-0.bpo.1-amd64
(G)UI : Xfce 4.12
Inscription : 23-04-2016

Re : [RESOLU] - Boucle while et rsync ???

Bonjour,
Merci pour ta réponse...

pour ton code, dsl, je suis plus dans la course


Que veux-tu dire par là, tu ne programme pas ou plus ?


- La logique vous conduira d'un point A à un point B, l'imagination et l'audace vous conduiront où vous le désirez ! (A. Einstein)
- Quelle époque terrible que celle ou des idiots dirigent des aveugles ! (W. Shakespeare)
- Si vous ne faites pas aujourd'hui ce que vous avez dans la tête, demain vous l'aurez dans le c... (Coluche) big_smile

Hors ligne

Pied de page des forums