Rsync et bash

Bonjour,

Je vais monter un serveur de sauvegarde prochainement, et créer un fichier bash pour automatiser les sauvegardes.
Je vais utiliser rsync pour effectuer les sauvegardes, j’ai besoin de tester plusieurs petites choses car j’ai une connexion assez merdique, du coup je me demandais :

Si dans mon script bash je lance la commande :
rsync dossier_source/ dossier_de_destination/

est-ce que le code qui sera à la suite de cette commande sera lancé après que le déplacement soit fini ? ou bien tout de suite après que la commande soit lancé ?
Quant est-il pour la commande scp ?

Ce que je souhaite vérifier c’est si le transfert s’est bien passé (en vérifiant le poids de chaque archive sur le serveur de save en comparant avec le poids des archives du serveur sauvegardé), m’envoyer un email pour m’indiquer si quelque chose a bugé et quoi. Mais aussi me donner quelques infos comme le temps du transfert, etc… etc… Du coup cette information est assez importante :confused:

Merci pour votre réponse

Tu as à peut près toutes les réponses à tes question sur ce fil :
http://www.debian-fr.org/sauvegarde-clonage-d-un-systeme-t25179.html

Salut,

[mono]$ rsync <options> /home/user/répertoires_à_sauvegarder /destination/dd_externe/ ?[/mono] pas d’options ?

[mono]# rsync <options> / /dd_externe/SAV_26012014_blabla/[/mono] options ?

[quote=“Balian”]est-ce que le code qui sera à la suite de cette commande sera lancé après que le déplacement soit fini ? ou bien tout de suite après que la commande soit lancé ?

Ce que je souhaite vérifier c’est si le transfert s’est bien passé (en vérifiant le poids de chaque archive sur le serveur de save en comparant avec le poids des archives du serveur sauvegardé), m’envoyer un email pour m’indiquer si quelque chose a bugé et quoi.[/quote]

options -> rsync

le Wiki : Catégorie Sauvegarde

Merci pour vos réponses, je vais étudier tout ca! :023

Re,

Afin d’attiser tes sens … :laughing:

Exemple du lancement d’une sauvegarde d’un serveur distant rapatriée en local sur un dd externe.

[mono]local <<- ssh ->> distant[/mono] en tant que root le tout puissant.

option -n = simulation :wink:

[code]21:02:56] ~ # time rsync -avzin --stats --del --partial --exclude-from=/root/exclureR -e ssh root@xxx.xxx.xxx.xxx:confused: /mnt/Domaine.com/racine/2013/octobre/15102013_08h50_Postfix_OK_remplace_phpboost_par_Dotclear2_sur_Domaine/


[/code]

Pour ton script sache que les commandes s’exécutent les unes après les autres, si tu veux les mettres en “parrallèle” il faut utiliser “&” à la fin de ta commande, par exemple :

L’inconvénient du [mono]&[/mono] c’est que les logs de la commande ne s’affiche pas sur la console, le [mono]2&1> fichier.log[/mono] à la fin est là pour tout mettre dans un fichier de log.

[quote=“Mimoza”]Pour ton script sache que les commandes s’exécutent les unes après les autres, si tu veux les mettres en “parrallèle” il faut utiliser “&” à la fin de ta commande, par exemple :

L’inconvénient du [mono]&[/mono] c’est que les logs de la commande ne s’affiche pas sur la console, le [mono]2&1> fichier.log[/mono] à la fin est là pour tout mettre dans un fichier de log.[/quote]

Merci pour ta réponse, parceque du coup je suis allé un peu jeter un oeil aux options etc. comme on m’a conseillé plus haut mais je n’ai rien trouvé (bon j’ai lu assez rapidement hier donc je comptais relire ca au calme) mais je pense que j’ai mal été compris dans ma question :confused: :blush:

Merci encore pour ta réponse, c’est en effet ce que je voulais savoir, car pour que mon script fonctionne, il faut impérativement que la commande rsync se finisse avant d’exécuter la suite de mon code, et tant qu’elle n’est pas finie, le reste du script bash soit mis en attente. Sinon mes calculs et mes données qui suivent la commande seront faussées!

Sinon pour les commandes ce n’est pas un problème, car je compte automatiser ce script et donc ne sera jamais lancé en console.
En fait, voilà ce que je compte faire (dans les grandes lignes), pour info le script est lancé sur mon serveur @home qui contiendra les sauvegardes, le script se situe donc sur ce serveur :
-Créer mon arborescence du jour pour le serveur sauvegardé
-Récuperer (via rsync ou scp, mais je préfére utiliser rsync car il permet de reprendre une sauvegarde en cas d’échec, vu que je compte sauvegarder une de mes machines qui peut avoir plus de 100go, cela m’embeterait de devoir tout me retaper le transfert avec scp par ex) 2 dossiers (celui contenant /etc/, l’autre toutes mes bases MySQL, et pour une de mes machines un troisième dossier > home) ainsi que 2 fichiers > la liste des paquets installés sur la machine, ainsi que le poids de chaque dossier archivé, et de chaque bases de données qui seront déplacées
-Une fois le transfert fini (impératif) le code dans le script bash après la commande rsync s’execute.
-Je ne sais pas si on peut indiquer plusieurs répertoire sur le source (je sais qu’on peut le faire sur le destination), selon cette info, soit je place tout là où je veux directement dans la commande rsync (selon mon arborescence), soit je mets tout dans un seul répertoire, et je fais le tri après. (ca ce n’est pas un problème, juste 2 déplacements quoi)
-Contrôle le poids de chaque archive pour être sûr que tout a bien été transféré correctement (grâce au document récupéré du serveur sauvegardé contenant le poids de chaque archive)
-si tout est ok envoie d’un email avec la liste de tout ce qui a été transferé, avec le temps de transfert et peut être la BP moyenne/s, sinon, envoyer ce qui a été et n’a pas été transféré
-suppression du fichier avec le poids
-copie de la sauvegarde sur le second disque dur

Rsync fait déjà un contrôle d’intégrité des fichiers transférés.

Les options [mono]–stats[/mono] et [mono]–progress[/mono] pourraient t’intéresser.

Salut,

[quote=“Mimoza”]rsync <options> /rep_sources /rep_dest & 2&1> fichier.log

L’inconvénient du & c’est que les logs de la commande ne s’affiche pas sur la console, le 2&1> fichier.log à la fin est là pour tout mettre dans un fichier de log.
[/quote]

C’est le moindre que l’on puisse dire.

[quote=“rsync”]

–log-format=FORMAT

Ceci vous permet de spécifier exactement ce que le client rsync affiche sur la sortie standard pour chaque fichier [NDT : to log = journaliser]. Le format de journalisation est une chaîne de caractère contenant des séquences d'échappement d'un caractère préfixées par un caractère pourcent «%». La liste des différents caractères d'échappement possibles est disponible dans la partie sur le format de journalisation de la page de manuel de rsyncd.conf. (Notez que cette option ne modifie pas l'aspect du journal du démon rsync.) 
Spécifier cette option forcera rsync à mentionner chaque fichier, répertoire, etc. modifié de manière significative (fichier transféré, lien symbolique/périphérique recréé, ou répertoire modifié). Si une séquence d'échappement des modifications d'attribut (%i) est inclue dans la chaîne de caractères, alors la journalisation des noms mentionnera toute entité qui a été modifiée d'une quelconque façon (tant que le côté récepteur est un rsync version 2.6.4 ou supérieure). Voir l'option --itemize-changes pour une description de l'affichage de «%i». 
L'option --verbose implique le format «%n%L», mais vous pouvez utiliser --log-format sans --verbose, ou redéfinir le format de l'affichage par fichier à l'aide de cette option. 
Rsync affiche la chaîne de journalisation avant le transfert du fichier à moins qu'une des statistiques de transfert ne soit demandée. Dans ce cas, la journalisation est faite après la fin du transfert. Lorsque la journalisation se fait après et que --progress a été spécifié, rsync affichera aussi le nom du fichier transféré avant l'information d'avancement (qui, bien sûr, sera ensuite suivie de l'affichage de journalisation). [/quote]

Existe-t’il une option pour mettre en pause le script bash pendant que rsync fait son affaire ? Apparement non inutile :

Mimoza a répondu à ma question, dans mon premier message j’avais cité rsync et scp, je souhaitais utiliser rsync car répond peut être plus à mes besoins. Mais ma question était pour l’un comme pour l’autre, mon but était surtout de connaître le comportement des commandes dans le sript bash ! Car si rsync ne répond pas à mes besoins, ma question est la même pour scp ou tout autre qui n’ont peut être pas un si grand nombre d’options que rsync. (donc en gros, je voulais juste savoir si rsync ou scp tournent a coté et que le script bash continue à s’executer ou non)

Merci pour vos réponses et les options, je vais étudier ca et faire quelques essais quand j’aurais reçu mon serveur, car pour rsync la doc sur les options ne me renseigne pas énormement sur le comportement

C’est à dire ?
En crontab ?
Une pause entre quoi ?
Que contient ce script ?


[mono]sleep[/mono] ?

[mono]at[/mono] ?

[quote]–timeout=DURÉE ?

Cette option vous permet de fixer le temps d'attente avant échec d'entrée/sortie en secondes. Si aucune donnée n'est transférée pendant la durée spécifiée alors rsync se termine. Vaut 0 par défaut, ce qui signifie une attente infinie. [/quote]

?

C’est à dire ?
En crontab ?
Une pause entre quoi ?
Que contient ce script ?
[/quote]
En crontab effectivement!

En gros soit le comportement :

commande rsync lancé mais transfert non fini (il continue pendant et voir apres l execution du reste du script Le script continue de s'executer

Ou

commande rsync lancée et transfert fini Le script bash continue de s'executer qu apres fin du transfert

Je ne comprends pas une chose : tu auras plusieurs scripts ?
Sinon, dans mon script de sauvegarde, on peut ajouter à la fin tout ce qu’on veut.
Et ce “tout ce qu’on veut” ne sera exécuté qu’une fois la sauvegarde terminée.
Perso, sur le mien, j’ai rajouté quelques actions de vérification, avec un temps de pause entre chacune, de façon à pouvoir en lire le résultat.
Processus :
1/ les questions et les actions de montage, de choix, etc.
2/ l’action d sauvegarde proprement dite
3/ les vérifications avec un “sleep” (pas un caleçon, hein) entre chacune d’elles
4/ le démontage

[quote]est-ce que le code qui sera à la suite de cette commande sera lancé après que le déplacement soit fini ? ou bien tout de suite après que la commande soit lancé ?
Quant est-il pour la commande scp ?[/quote]
Le bash est un langage scripté, donc les commandes se lancent les unes à la suite des autres, seulement une fois qu’elles ont été exécutées totalement.

Mais il est possible de lancer une commande et de faire en sorte qu’elle s’exécute en tâche de fond, et que le script continue sans attendre qu’elle se soit terminée. Pour cela il faut ajouter le symbole “&” à la fin de la commande.

Par exemple, prend un très gros fichier, et lance la commande suivante :

Tu verras que tu devras attendre que la copie soit terminée pour reprendre la main dans la console.

Maintenant lance la commande suivante (en prenant un autre gros fichier pour éviter la mise en cache dans la RAM qui pourrait tromper la vitesse de copie) :

Là tu verras que tu reprends immédiatement la main sur la console mais que la copie s’effectue en tâche de fond.

Ca fonctionne exactement pareil dans un script .sh puisqu’un tel fichier n’est qu’un ensemble de commandes que tu lancerais manuellement dans un terminal.

Chose utile à savoir quand on lance une taĉhe en arrière-plan : il peut être utile d’utiliser [mono]nohup[/mono] ou un gestionnaire de sessions de terminal comme [mono]screen[/mono] ou équivalent.

:083

C’est à dire ?
En crontab ?
Une pause entre quoi ?
Que contient ce script ?
[/quote]
En crontab effectivement!

En gros soit le comportement :

commande rsync lancé mais transfert non fini (il continue pendant et voir apres l execution du reste du script Le script continue de s'executer

Ou

commande rsync lancée et transfert fini Le script bash continue de s'executer qu apres fin du transfert[/quote]

Cela ne me parle absolument pas !

Je réitère, [strike]une fois[/strike] …

Que contient ce script ?
Quelle est cette tâche cron ?


Actuellement, nous sommes dans l’hypothétique … :033

J’ai déjà fait plusieurs scripts bash dont certains de sauvegardes (BD, système) donc là dessus il n’y a pas de problème j’ai bien vu que c’était séquentiel.

Mais c’est justement ce point là (cité) que je voulais éclaircir, je voulais juste être certain que rsync ne va justement pas s’executer en tâche de fond. Vu qu’en ce moment je ne peux pas faire d’essai, mais que je vais programmer en avance mon script, je souhaitais être sûr de ce point pour ne pas le programmer “pour rien”. (par exemple si on ne pourrait pas l’empêcher, ou autre)
Voilà c’était une question toute bête, je me suis dit on sait jamais, autant en être sûr et pas bosser dans le vent :115 j’aurais du préciser “question conne” dans le titre du sujet :mrgreen:

Merci à vous pour vos réponses!

Du coup tu peux cliquer sur le pour marquer le sujet en ‘Résolu’.

:006

Si on veut lancer une commande en tâche de fond, dans un script Bash, on peut utiliser la commande interne [mono]coproc[/mono] de Bash. Comme ça on peut même récupérer le code de retour de la tâche lancée en fond.