Aller au contenu

Utiliser Rsync


jlbn

Messages recommandés

Je n'avais pas installé ipkg au moment où j'ai posé ma question. C'est vrai qu'une fois installé j'aurais dû le mentionner, désolé.

J'ai comme toi le DS213J, je n'ai installé ipkg que pour installer vim et nail, j'éviterai de trop m'appuyer dessus, j'ai lu comme toi qu'il n'était pas forcément super stable sur ce modèle.

Je pense que je suis tranquille pour un petit moment, mes sauvegardes sont en place et je peux m'envoyer les rapports de mes scripts rsync par mail, j'ai tout ce dont j'ai besoin :)

Encore merci à toi et jlbn :)

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 70
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Bonjour,

Puisque le sujet semble intéressé certains, et comme je n'avais pas vraiment trouvé mon bonheur lorsque je me suis décidé à faire mon propre script, voici le mien qui pourra je pense aider des débutants comme moi.

Les fonctionnalités :

  • sauvegarde en rsync au travers d'une connexion ssh par clé
  • utilisation de l'option backup et backup-dir afin de conserver les fichiers supprimés sur la source dans un dossier jours
  • utilisation de l'option partial et partial-dir pour conserver les fichiers en cours de transfert en cas de coupure de connexion
  • création d'un fichier log journalier et d'un log d'erreur journalier
  • envoi d'un mail spécifique en cas de réussite reprenant début de sauvegarde, fin de sauvegarde et dernières données stats du fichier log
  • envoi d'un mail spécifique lorsque la sauvegarde est stoppée avant la fin (ce qui est mon cas via le planificateur et un "killall rsync" tous les matins à 9 heures
  • envoi d'un mail spécifique en cas d'autres erreurs avec le log d'erreur en pièce jointe
  • Suppression du dossier "jours" des fichiers supprimés sur la cible au bout de x jours suivant un paramètre "RETENTION"

J'imagine que l'on peut faire mieux mais cela correspond à mes besoins et ça permet de combler quelques lacunes du module de base "sauvegarder et restaurer".

Il y a par ailleurs des scripts plus élaboré sur le forum pour ceux qui veulent aller plus loin (gestion des sauvegardes tournante notamment ...)

Ne pas oublier aussi de fixer des règles les plus strictes possibles dans le pare feu (en ce qui me concerne le serveur cible n'est accessible que en local ou via mon ip fixe), d'activer le blocage des ip, et j'en oublie sans doute d'autres.

jlbn

#!/bin/sh
PATH=/bin:/usr/bin:/usr/syno/bin

#Déclaration des variables
date=`date +%y_%m_%d`
LOG=/volume1/aaa/rsync/log #dossier des fichiers log
EXCLURE=/volume1/aaa/rsync/exclure.txt #fichiers des éléments à exclure
SOURCE=/volume1/aaa
DEST=/volume1/aaa/bbb/
BACKUP=/volume1/aaa/suppr #Emplacement des dossiers journaliers des fichiers supprimés
PARTDIR=/volume1/aaa/partial #Emplacement des fichiers partiels
SERVEUR=util@adresse_ip #Nom du serveur cible
PORT=5555 #Spécifie le numéro de port ssh
RETENTION=4 #Nb de jours où les sauvegardes journalières des fichiers supprimés sont conservés
RSA=/zzz/.ssh/id_dsa #ficher de la clé ssh
SMTP=smtp.aaa.fr #serveur smtp pour l'envoi de mail via un smtp sans authentification
ADRMAIL=votreadressemail.fr #Mail d'envoi et reception
SENDMAIL=/yyy/my_sendmail #Chemin complet du script perl d'envoi des mail - Utilisation du script perl de CoolRaoul
SUJET="DiskStation - Synology DiskStation" #Sujet des mails envoyés
#Fin de déclaration des variables

#Ecriture dans le log de la date et heure de lancement
DEBUT="Lancement de la sauvegarde $(date +%A) $(date +%d) $(date +% $(date +%Y) à $(date +%H)h et $(date +%M)min"
echo "" >$LOG/$date.log
echo "========================================================================================================================" >> $LOG/$date.log
echo "$DEBUT" >> $LOG/$date.log
echo "========================================================================================================================" >> $LOG/$date.log
echo "" >> $LOG/$date.log

#Stock dans une variable les premières lignes du log pour réutilisation dans le mail
STATLOG1=$(tail "$LOG/$date.log")

#Lancement de la sauvegarde
rsync -arv --stats --partial --partial-dir=$PARTDIR --delete --backup 
    -e "ssh -p $PORT -i $RSA" 
	--backup-dir=$BACKUP/$date/ 
	--exclude-from=$EXCLURE 
	$SOURCE $SERVEUR:$DEST >> $LOG/$date.log 2>$LOG/erreur-$date.log

#Code de la sauvegarde
STATUT=$?
	
#Ecriture de la date et de l'heure de fin de la sauvegarde
FIN="Fin de la sauvegarde $(date +%A) $(date +%d) $(date +% $(date +%Y) à $(date +%H)h et $(date +%M)min"
echo "" >> $LOG/$date.log
echo "========================================================================================================================" >> $LOG/$date.log
echo "$FIN" >> $LOG/$date.log
echo "========================================================================================================================" >> $LOG/$date.log

#Stock dans une variable les dernières lignes du log pour réutilisation dans le mail
STATLOG2=$(tail -n 19 "$LOG/$date.log")

#Gestion du fichier d'erreur et envoi du mail en fonction du code statut de la sauvegarde
if [ $STATUT -eq 0 ]
then
  echo "La sauvegarde a reussi - Code statut = $STATUT $STATLOG1 $STATLOG2" | $SENDMAIL -s "$SUJET" 
  -f "$ADRMAIL" -m $SMTP $ADRMAIL
  rm $LOG/erreur-$date.log
elif [ $STATUT -eq 20 ]
then
  echo "La sauvegarde a ete stoppee par le planificateur ou manuellement - Code statut = $STATUT $STATLOG1 $STATLOG2" | $SENDMAIL -s "$SUJET" 
  -f "$ADRMAIL" -m $SMTP $ADRMAIL
  rm $LOG/erreur-$date.log 
else
  echo "La sauvegarde a echoue - Code statut = $STATUT $STATLOG1 $STATLOG2" | $SENDMAIL -s "$SUJET" 
  -f "$ADRMAIL" -m $SMTP $ADRMAIL "$LOG/erreur-$date.log"
fi

#Supression du dossier des fichiers supprimés le plus ancien selon la variable RETENTION définie en jours
ssh $SERVEUR "cd '$BACKUP' && find . -type d -maxdepth 1 -mindepth 1 -mtime +'$RETENTION' | xargs rm -r"

exit
Modifié par jlbn
Lien vers le commentaire
Partager sur d’autres sites

J'ai modifié la manière de gérer les dossiers de backup.

cette fois, le script ne se base plus sur le "mtime" mais sur le nombre de dossiers présent dans le dossier backup. Je pense que ça permet de gérer le cas où il n'y a pas de fichiers supprimés dans la source donc pas de dossier daté du jour de la sauvegarde.

J'imagine qu'il y a plus simple mais ça marche :

#On conserve les x derniers dossiers du repertoire BACKUP en fonction de la valeur de RETENTION
NBREP=$(ssh $SERVEUR "ls -1d $BACKUP/* | wc -l")
if $NBREP<=$RETENTION
then
  exit 1
else
  let NBLISTE=$NBREP-$RETENTION
  ssh $SERVEUR "ls -1d $BACKUP/* | head -n $NBLISTE | xargs rm -r"
fi
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à tous,

encore une question.

J'ai activé pour ma sauvegarde rsync l'option "stats" que je redirige dans un fichier log et dans des variables pour une réutilisation dans un mail.

hors, aussi bien le fichier log que le mail ne gèrent correctement les caractères accentués.

Par exemple un dossier "Médiathèque" devient : "M#303#251diath#303#250que"

Je crois comprendre que c'est un problème d'encodage. je ne sais si c'est utile de le préciser, mais je visualise les fichiers log avec notepad++ mais la fonction d'encodage ne change rien.

Y a t-il un moyen pour faire apparaître correctement ces caractères ?

Merci de vos retours

Lien vers le commentaire
Partager sur d’autres sites

DSM n'inclue pas par défaut les commandes ("locale", "localedef") et fichiers nécessaires au support *en ligne de commande* des caractères internationaux (codage UTF-8 par exemple).

Tous le reste du système par contre est entièrement localisé (GUI d’administration, système de fichier, etc...) bien évidemment.

Il est cependant possible d'intégrer ce support en récupérant et copiant quelques fichiers à partir des toolchains officielles.

Ca à déja été discuté dans le forum.

J'ai aussi gardé un bookmark sur ce tuto que j'ai trouvé clair et succinct.

PS: faudrait envisager de créer des sujet spécifiques quand il s'agit de problèmes différents sinon ce fil risque de devenir un fourre-tout illisible.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

je déterre mon sujet !

 

utilisateur depuis maintenant plus de 2 ans d'un script permettant la sauvegarde en rsync, celui-ci marche parfaitement bien et répond (presque) à mes besoins.

en effet je souhaiterais maintenant prioriser la sauvegarde de certains dossiers.

Je m'explique : j'ai par exemple des dossiers à sauvegarder :

# inclusion des répertoires à sauvegarder et de leur contenu
+ svg_dossier2/
+ svg_dossier2/**
+ svg_dossier1/
+ svg_dossier1/**
+ commun/
+ Commun/**
+ Backup/
+ Backup/**
+ web/
+ web/**

et je souhaite que la sauvegarde se fasse dans cet ordre, d'abord le dossier et son contenu svg_dossier2, puis svg_dossier1, puis ...

Je souhaite cet ordre précis dans le cas ou le volume de données à sauvegarder est important, la sauvegarde se fait dans l'ordre indiqué et traite les dossiers importants, puis s'il reste du temps (je fais un killall rsync à 9h), traite le reste. Sinon, la sauvegarde reprendra un peu plus tard et traitera la liste des dossiers dans le même ordre la fois suivante.

 

je pensais qu'avec un --include-from, ça fonctionnerait mais non, les dossiers sont traités récursivement selon l'ordre trouvé dans la source (contenu de volume1 chez moi).

 

J'ai cherché dans le manpage de rsync une option (l'option r ?) mais je ne suis pas sûr de moi. Sinon, il y a peut être la solution d’enchaîner les commandes rsync mais ça me semble très lourd à gérer (un rsync pour le dossier svg_dossier2, puis un autre pour le dossier svg_dossier1, puis...

 

une idée ? et surtout une solution en gardant la simplicité de passer par un seul rsync et un fichier txt pour le include-from ?

 

merci d'avance

 

jlbn

 

Lien vers le commentaire
Partager sur d’autres sites

Le 29/07/2016 at 16:35, jlbn a dit :

une idée ?

Je n'ai pas sortie la pelleteuse pour lire les messages précédents (ni ton script), mais comme les autres paramètres sont probablement les mêmes, une boucle sur la liste des dossiers autour de la commande devrait faire l'affaire.

#!/bin/bash
folders=( "svg_dossier2" "svg_dossier1" "commun" "backup" "web" )
for folder in "${folders[@]}"
do
        echo "Traitement du dossier : $folder"
        #ici ta commande rsync
        #rsync -a /volume1/$folder /volume2/
done

Pour tester, tu peux utiliser --dry-run, ça simule l'exécution sans rien faire

Lien vers le commentaire
Partager sur d’autres sites

merci je teste et fait un retour

sinon, j'abuse un peu mais la liste des fichiers j'aimerais aller la chercher dans un fichier txt au lieu de l'inscrire en dur dans le script. (même si ça ne change pas grand chose c'est vrai)

Modifié par jlbn
Lien vers le commentaire
Partager sur d’autres sites

bon après test, le bout de code de Fenrir ne semble pas fonctionner avec les noms de dossier comportant des espaces, mais il m'avait mis sur la voie, j'ai donc utilisé :

while read line; do
		echo "TRAITEMENT DU DOSSIER : $line" >> $LOG/0000-dryrun.log
		#Lancement de la sauvegarde
		rsync -av --dry-run --stats --progress --human-readable --force --partial --partial-dir=$PARTDIR --delete --backup \
			-e "ssh -p $PORT -i $RSA" \
			--backup-dir=$BACKUP/$date/ \
			--exclude-from=$EXCLURE \
			""$SOURCE""$line"/" ""$SERVEUR":"$DEST"/"$line"" >> $LOG/0000-dryrun.log 2>$LOG/0000-dryrun-erreur.log
	done < $INCLURE

avec la variable inclure contenant la liste des dossiers.

mais là encore des soucis avec des dossiers comportant des espaces et la liste d'eclusion ne fonctionne plus (et je ne vois pas pourquoi)

 

j'abandonne pour le moment, merci à Fenrir 

 

jlbn

Lien vers le commentaire
Partager sur d’autres sites

re,

 

bon finalement, après quelques essais ça fonctionne, il y avait plusieurs erreurs de ma part :

  • sur le fichier d'exlusion, il faut entourer le caractère # avec [#], sinon la ligne est interprétée comme un commentaire
  • sur le fichier permettant de sélectionner les dossiers à sauvegarder dans l'ordre voulu, il faut une dernière ligne à vide sinon le dernier dossier n'est pas pris en compte (manque un retour chariot)

je remet pour ceux que ça intéresse le script complet.

 

donc le script complet : 

#!/bin/sh
PATH=/bin:/usr/bin:/usr/syno/bin

###############################################################################################################
#				               	 Script de Sauvegarde Rsync                                                   #
###############################################################################################################
# Version initiale : 05/03/2014 V.1.00                                                                        #
# Version modifiée : 18/08/2014 V.1.10 Ajout de stat en début de log avec un dryrun                           #
#                    06/08/2016 V.1.20 Ajout d'une boucle permettant de traiter les dossiers dans un ordre    #
#                                      précis à l'aide de la variable INCLURE et d'une boucle while read      #
#                                      recodage avec egrep pour stats dans le mail                            #
###############################################################################################################
# Réalisé par jlbn - Utilisation du script perl de CoolRaoul pour l'envoi de mail                             #
###############################################################################################################
# Reste à réaliser :                                                                                          #
#  - en option, vérifier si le serveur cible est allumé                                                       #
#  - en option, allumer le serveur distant le cas échéant au début du script et l'éteindre à la fin           #
#                                                                                                             #        
###############################################################################################################

#DECLARATION DES VARIABLES
date=`date +%y_%m_%d` #Définition du dossier daté du jour
LOG=/volume1/Backup/rsync/log #Dossier des fichiers log
SIMUL=/volume1/web/simulation.txt #emplacement du fichier simulation permettant de modifier le mode via une page web
EXCLURE=/volume1/Backup/rsync/exclure.txt #Fichier texte des éléments à exclure
INCLURE=/volume1/Backup/rsync/inclure.txt #Fichier texte des éléments à inclure pas utilise pour le moment
SOURCE=/volume1/ #contenu source à sauvegarder
DEST=/volume1/backup/xxx/ #emplacement de destination des sauvegardes
BACKUP=/volume1/backup/fichiers_suppr #Emplacement sur le serveur cible des dossiers journaliers comprenant les fichiers supprimés sur la source
PARTDIR=/volume1/backup/rsync_partial #Emplacement des fichiers partiels en cours de transfert
SERVEUR=root@999.999.999.999
SIMULATION=$(head -1 $SIMUL) #Fixé la valeur à 1 pour une simulation sinon 0, la valeur est définie à partir du fichier défini par la variable simul
PORT=22 #Spécifie le numéro de port ssh, en local utiliser le port 22
RETENTION=10 #Nb des x derniers dossiers conservés dans le dossier BACKUP du serveur cible
RETENTION2=30 #Nb des x derniers fichiers conservés dans le dossier LOG du serveur source
RSA=/xxx/.ssh/id_dsa #Ficher de la clé ssh
SMTP=smtp.xxx.xxx.xxx #Serveur smtp pour l'envoi de mail via un smtp sans authentification sfr = smtp.sfr.fr ovh = smtp.dsl.ovh.net orange = smtp.orange.fr
ADRMAIL=votre.Adresse@mail.com #Mail d'envoi et reception
SENDMAIL=/usr/local/bin/my_sendmail #Chemin complet du script perl d'envoi des mail - Utilisation du script perl de CoolRaoul
SUJET="DiskStation - Synology DiskStation" #Sujet des mails envoyés
NBMAX=10000 #nb maxi de fichiers supprimés par sécurité, utilisé avec le paramètre rsync --max-delete=NUM
#FIN DE LA DECLARATION DES VARIABLES ET DE LA CONFIGURATION, NE PAS MODIFIER PLUS BAS
#******************************************************************************************************************

if [ ${SIMULATION} -eq 1 ]
then

	#Ecriture dans le log de la date et heure de lancement
	DEBUT="Lancement de la sauvegarde $(date +%A) $(date +%d) $(date +%B) $(date +%Y) à $(date +%H)h et $(date +%M)min"
	echo "===========================================================================" > $LOG/0000-dryrun.log
	echo "$DEBUT" >> $LOG/0000-dryrun.log
	echo "===========================================================================" >> $LOG/0000-dryrun.log
	echo "" >> $LOG/0000-dryrun.log
	
	#Lancement de la sauvegarde
	rsync -av --dry-run --stats --human-readable --force --partial --partial-dir=$PARTDIR --delete-excluded --max-delete=$NBMAX --backup \
		-e "ssh -p $PORT -i $RSA" \
		--backup-dir=$BACKUP/$date/ \
		--exclude-from=$EXCLURE \
		$SOURCE $SERVEUR:$DEST >> $LOG/0000-dryrun.log 2>$LOG/0000-dryrun-erreur.log
		
	#Code de la sauvegarde
	STATUT=$?

	#Ecriture de la date et de l'heure de fin de la sauvegarde
	FIN="Fin de la sauvegarde $(date +%A) $(date +%d) $(date +%B) $(date +%Y) à $(date +%H)h et $(date +%M)min"
	echo "" >>$LOG/0000-dryrun.log
	echo "===========================================================================" >> $LOG/0000-dryrun.log
	echo "$FIN" >> $LOG/0000-dryrun.log
	echo "===========================================================================" >> $LOG/0000-dryrun.log
	
	#Gestion du fichier d'erreur
	if [ $STATUT -eq 0 ] || [ $STATUT -eq 20 ]; then
	  rm $LOG/0000-dryrun-erreur.log
	fi

elif [ ${SIMULATION} -eq 0 ]
then

	#Ecriture dans le log de la date et heure de lancement
	DEBUT="Lancement de la sauvegarde $(date +%A) $(date +%d) $(date +%B) $(date +%Y) à $(date +%H)h et $(date +%M)min"
	echo "" > $LOG/$date.log
	echo "===========================================================================" >> $LOG/$date.log
	echo "$DEBUT" >> $LOG/$date.log
	echo "===========================================================================" >> $LOG/$date.log
	echo "" >> $LOG/$date.log

	#Stock dans une variable les premières lignes du log pour réutilisation dans le mail
	STATLOG1=$(cat "$LOG/$date.log")

	#lance un dry run pour stats de sauvegarde
	rsync -av --dry-run --stats --human-readable --force --partial --partial-dir=$PARTDIR --delete-excluded --max-delete=$NBMAX --backup \
		-e "ssh -p $PORT -i $RSA" \
		--backup-dir=$BACKUP/$date/ \
		--exclude-from=$EXCLURE \
		$SOURCE $SERVEUR:$DEST > $LOG/0000-dryrun.log 2>$LOG/$date-erreur.log

	#Récupérer les statistiques du dryrun
	grep ^"Number of files:" "$LOG/0000-dryrun.log" >> $LOG/$date.log
	grep ^"Total file size:" "$LOG/0000-dryrun.log" >> $LOG/$date.log
	grep ^"Number of files transferred:" "$LOG/0000-dryrun.log" >> $LOG/$date.log
	grep ^"Total transferred file size:" "$LOG/0000-dryrun.log" >> $LOG/$date.log
	echo "" >> $LOG/$date.log

	while read line; do
		echo "======Sauvegarde=======" >> $LOG/$date.log
		echo "TRAITEMENT DU DOSSIER : $line" >> $LOG/$date.log
		echo "======Statistiques=======" >> $LOG/$date.log
		#Lancement de la sauvegarde
		rsync -av --stats --progress --human-readable --force --partial --partial-dir=$PARTDIR --delete-excluded --max-delete=$NBMAX --backup --protect-args \
			-e "ssh -p $PORT -i $RSA" \
			--backup-dir=$BACKUP/$date/ \
			--exclude-from=${EXCLURE} \
			"${SOURCE}${line}"/ ${SERVEUR}:"${DEST}/${line}" >> $LOG/$date.log 2>$LOG/$date-erreur.log
		echo "======fin de sauvegarde du dossier $line=======" >> $LOG/$date-erreur.log	
	done < ${INCLURE}
	
	#Suppression dans le fichier de log des "progress" intermédiaires
	perl -0pe 's/[\r]/\n/g' < $LOG/$date.log > $LOG/$date-2.log #remplace les sauts CR en LF
	grep -v "%)$" $LOG/$date-2.log > $LOG/$date.log #supprime les "progress" intermédiaires
	rm $LOG/$date-2.log #supprime le fichier temporaire crée

	#Code de la sauvegarde
	STATUT=$?

	#Ecriture de la date et de l'heure de fin de la sauvegarde
	FIN="Fin de la sauvegarde $(date +%A) $(date +%d) $(date +%B) $(date +%Y) à $(date +%H)h et $(date +%M)min"
	echo "" >>$LOG/$date.log
	echo "===========================================================================" >> $LOG/$date.log
	echo "$FIN" >> $LOG/$date.log
	echo "===========================================================================" >> $LOG/$date.log

	#Stock dans une variable les statistiques du log pour réutilisation dans le mail
	echo "======Statistiques globales======" > $LOG/stat.log
	egrep "^======Sauvegarde=======|^TRAITEMENT DU DOSSIER|^======Statistiques=======|^Number of files:|^Number of files transferred:|^Total file size:|^Total transferred file size:|^======fin de sauvegarde=======" \
	"$LOG/$date.log" >> $LOG/stat.log
	echo "" >> $LOG/stat.log
	STATLOG2=$(cat "$LOG/stat.log")

	#Stock dans une variable les dernières lignes du log pour réutilisation dans le mail
	echo "" > $LOG/stat.log
	tail -n 3 $LOG/$date.log >> $LOG/stat.log
	STATLOG3=$(cat "$LOG/stat.log")

	#Stock dans une variable la liste des fichiers supprimés dans la cible
	echo "" > $LOG/fichiersuppr.log
	echo "Liste des fichiers presents dans le dossier $date :" >> $LOG/fichiersuppr.log
	echo "     --------------------------     " >> $LOG/fichiersuppr.log
	grep '^deleting ' $LOG/$date.log | sed s/^"deleting "//gw >> $LOG/fichiersuppr.log
	LISTESUPPR=$(cat $LOG/fichiersuppr.log)

	#Gestion du fichier d'erreur et envoi du mail en fonction du code statut de la sauvegarde
	if [ $STATUT -eq 0 ]
	then
	  echo "La sauvegarde a reussi - Code statut = $STATUT $STATLOG1 $STATLOG2 $STATLOG3 $LISTESUPPR" | $SENDMAIL -s "$SUJET" \
	  -f "$ADRMAIL" -m $SMTP $ADRMAIL
	  rm $LOG/$date-erreur.log
	elif [ $STATUT -eq 20 ]
	then
	  echo "La sauvegarde a ete stoppee par le planificateur ou manuellement - Code statut = $STATUT $STATLOG1 $STATLOG2 $STATLOG3 $LISTESUPPR" | $SENDMAIL -s "$SUJET" \
	  -f "$ADRMAIL" -m $SMTP $ADRMAIL
	  rm $LOG/$date-erreur.log
	else
	  echo "La sauvegarde a echoue - Code statut = $STATUT $STATLOG1 $STATLOG2 $STATLOG3 $LISTESUPPR" | $SENDMAIL -s "$SUJET" \
	  -f "$ADRMAIL" -m $SMTP $ADRMAIL "$LOG/$date-erreur.log"
	fi

	#Supprime les logs devenus inutiles
	rm $LOG/fichiersuppr.log
	rm $LOG/stat*.log
	rm $LOG/*dryrun*.log

	#On conserve les x derniers dossiers du repertoire BACKUP en fonction de la valeur de RETENTION
	NBREP=$(ssh -p $PORT -i $RSA $SERVEUR "ls -1d $BACKUP/* | wc -l")
	let CRIT1=$NBREP-$RETENTION
	if [ $CRIT1 -le 0 ]
	then
		break;
	else
		let NBLISTE=$NBREP-$RETENTION
		ssh -p $PORT -i $RSA $SERVEUR "ls -1d $BACKUP/* | head -n $NBLISTE | xargs rm -r"
	fi

	#On conserve les x derniers fichiers du repertoire LOG en fonction de la valeur de RETENTION2
	NBREP2=$(ls -1 $LOG/* | wc -l)
	let CRIT2=$NBREP2-$RETENTION2
	if [ $CRIT2 -le 0 ]
	then
		break;
	else
		let NBLISTE2=$NBREP2-$RETENTION2
		ls -1 $LOG/* | head -n $NBLISTE2 | xargs rm -r
	fi
fi
exit

bonne journée

Modifié par jlbn
modification suite aux conseils de Fenrir
Lien vers le commentaire
Partager sur d’autres sites

il y a 8 minutes, jlbn a dit :

sur les noms de dossiers avec espace, j'ai ajouté "?" : nom?du?dossier?avec?espace et ça passe

attention avec le ?, c'est un joker => document?perso=document perso/document_perso/document-perso/documentsperso/...

Pour ton script, quelques suggestions :

  • pour les logs :
    • mets la date dans le nom du fichier, ça permet d'avoir un historique des actions et une rotation des fichiers
    • rajoute un # (voir plusieurs) devant tes commentaires pour bien différencier les étapes dans le fichier
    • s'ils sont gros, compresse les avant de les envoyer par mail
  • rsync, tu as quelques options qui pourraient d’intéresser :
    • --delete-excluded : si tu as sauvegardé un dossier, mais que tu n'en veux plus
    • --delete-before (suppression avant la copie, utile dans le cas où la place est limitée) ou --delete-delay (plus sécurisant)
    • --contimeout : ça te permet de gérer la disponibilité de la destination
    • --compress, utile en cas de débit faible, à utiliser --skip-compress (pas la peine de compresser les mp3 par exemple)
    • --max-delete : c'est une sécurité que je rajoute souvent, pour éviter de vider la destination en cas d'erreur ou d'opération de rangement/nettoyage de la source
    • --protect-args pour gérer les caractères spéciaux (espace par exemple)
    • --verbose, --stats, --progress, --human-readable ... ça ralenti beaucoup la vitesse (ça bouffe du cpu), surtout si c'est pour les virer des logs après (ce qui bouffe aussi du cpu et de l'io)
  • syntaxe :
    • dans tes test, "=" c'est pour une affectation, pas une comparaison (parfois ça marche, parfois non), utilise plutôt "-eq" ou "=="
    • tu peux chainer les test : if [ $STATUT -eq 0 ] || [ $STATUT -eq 20 ]; then
Lien vers le commentaire
Partager sur d’autres sites

merci pour ces conseils, j'avais compris pour le caractère ?, mais j'ai essayé avec nom\ du dossier\ avec\ espace et ça n'a pas fonctionné.

une autre question, au début du scipt j'ai mis :

#!/bin/sh
PATH=/bin:/usr/bin:/usr/syno/bin

quelle est la différence avec :  #!/bin/bash ?

jlbn

Lien vers le commentaire
Partager sur d’autres sites

à priori, le traitement correct des espaces avec le "\" fonctionne en bash mais pas en sh. or, j'ai tout écrit en sh, comment je fait pour transformer le script en bash et le lancer dans le planificateur ?.

 

Par ailleurs, le script fonctionnera-t-il pour tout le reste ?

 

merci

 

jlbn

Lien vers le commentaire
Partager sur d’autres sites

sh et bash sont très proche niveau syntaxe, pour tester, il suffit de changer le shebang.

Mais si c'est juste pour échapper les espaces, ça ne vaut pas le coup.

Tu as d'autres manière de le faire, les simple quote (') par exemple si tu utilises --protect-args

Par contre, si tes espaces sont juste dans --exclude-from, tu ne devrais rien avoir à échapper

Donc question : ton soucis c'est avec ${INCLURE} ou ${EXCLURE} ?

=>

  • si c'est ${INCLURE} : utilises --protect-args
  • si c'est ${EXCLURE} : rien à échapper
  • si c'est ${INCLURE} et ${EXCLURE} : utilises --protect-args avec des quotes dans la commande et n'échappe rien dans le fichier
Lien vers le commentaire
Partager sur d’autres sites

Il y a 1 heure, Fenrir a dit :

Donc question : ton soucis c'est avec ${INCLURE} ou ${EXCLURE} ?

je dois être un boulet, mais ça ne fonctionne pas et pour répondre à la question, c'est bien le INCLURE qui pose problème :

le contenu du fichier lié à la variable ${INCLURE} :

Commun famille
svg_dossier1

le contenu du fichier lié à la variable ${EXCLURE} :

aquota.*
*~
*Thumbs.db
*Autorun.inf
.DS_Store
@*/
@*
[#]*/
[#]*
.sync/

la partie du script traitant la sauvegarde :

while read line; do
		echo "======Sauvegarde=======" >> $LOG/0000-dryrun.log
		echo "TRAITEMENT DU DOSSIER : $line" >> $LOG/0000-dryrun.log
		echo "======Statistiques=======" >> $LOG/0000-dryrun.log
		#Lancement de la sauvegarde
		rsync -av --dry-run --stats --progress --human-readable --force --partial --partial-dir=$PARTDIR --delete-excluded --max-delete=$NBMAX --backup --protect-args \
			-e "ssh -p $PORT -i $RSA" \
			--backup-dir=$BACKUP/$date/ \
			--exclude-from=${EXCLURE} \
			${SOURCE}${line}/ ${SERVEUR}:${DEST}/${line} >> $LOG/0000-dryrun.log 2>$LOG/0000-dryrun-erreur.log
		echo "======fin de sauvegarde du dossier $line=======" >> $LOG/0000-dryrun.log	
	done < ${INCLURE}

le dossier commun famille n'est toujours pas traité.

 

jlbn

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.


×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.