#1 Le 27/06/2009, à 14:51
- Laserpithium
Voici un script pour sauvegardes automatiques
Aaaaah, les sauvegardes !!!
Tout le monde est d'accord pour dire que faire des sauvegardes est nécessaire, personne ne les fait et au final tout le monde s'en mord les doigts le jour ou par malheur, le disque dur crâme. Moi le premier.
Amis Linuxiens, agissons ! Tous ensemble, disons non aux pertes de données pour cause de flemme de sauvegarder !
Voici donc ma contribution à la résolution de ce problème: un script permettant de faire des sauvegardes. Le problème majeur restant l'interface chaise/clavier, ce script permet de faire des sauvegardes automatiquement (il suffit de le mettre dans la crontab).
Ce script fonctionne de 2 manières différentes:
1) En mode manuel. On le lance sans argument ("sauvegardeSysteme.sh"), il sauvegarde votre home sur un disque dur externe. Si le disque n'est pas branché, il vous jette. Un fichier de log est mis à jour.
2) En mode automatique, typiquement appelé depuis la crontab, avec le paramètre "auto" ("sauvegardeSysteme.sh auto").
Dans ce mode, le script effectue 2 types de sauvegardes:
- Une sauvegarde journalière (il synchronise le home si la dernière synchro date de plus de 24h).
- Une sauvegarde mensuelle (il synchronise le home dans un second dossier tout les mois). Le but de la sauvegarde mensuelle est d'éviter de perdre un fichier que l'on a effacé par erreur. C'est un bonus.
Dans tous les cas, un fichier de log est mis à jour.
Voici le script en question:
#!/bin/bash
REPERTOIRE_SOURCE="/home/"
REPERTOIRE_DESTINATION="/media/sauvegarde/home/"
REPERTOIRE_DESTINATION_LONG="/media/sauvegarde/homeLongTerme/"
LOG="/media/sauvegarde/home/sauvegarde.log"
LOGLONG="/media/sauvegarde/homeLongTerme/sauvegarde.log"
ERREUR="/media/sauvegarde/home/error.log"
ERREURLONG="/media/sauvegarde/homeLongTerme/error.log"
# Détecter la présence du volume de destination et interrompre l'opération si nécessaire, avec message d'erreur en cas de lancement manuel
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
if [ -z $1 ]; then echo "Attention, le disque de sauvegarde n'est pas présent"
fi
exit 0
fi
if [ -z $1 ]
#Si mode manuel, on regarde le temps depuis la dernière sauvegarde et on propose une sauvegarde
then
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOG`"
let "delai = `date +%s` - lastSauvegarde"
let "delaiJour = delai/86400"
let "delaiHeure = (delai - delaiJour*86400)/3600"
echo "La dernière sauvegarde a été effectuée il y a $delaiJour jours $delaiHeure heures"
read -p 'Effectuer une nouvelle sauvegarde o/n ? : ' answer
if [ $answer = "o" ] || [ $answer = "O" ]
then
echo "Sauvegarde en cours..."
#Sauvegarde
rsync -a --copy-links --stats --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION"
#Mise à jour du fichier de log court terme
echo "" >> $LOG
echo "Dernière sauvegarde effectuée manuellement le:" >> $LOG
date >> $LOG
date +%s >> $LOG
else
echo "Sortie sans sauvegarder"
fi
echo "Fin de la commande de sauvegarde. Sortie du programme"
exit 0
elif [ $1=="auto" ]
then
#Si lancement auto, on regarde si il s'est écoulé un temps suffisant depuis la dernière sauvegarde
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOG`"
let "delai = `date +%s` - lastSauvegarde"
if [ $delai -gt 86400 ]
then
#Sauvegarde si le délai est de plus de 24h
rsync -aq --copy-links --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION" >> /dev/null 2> $ERREUR
#Mise à jour du fichier de log court terme
echo "" >> $LOG
echo "Dernière sauvegarde effectuée automatiquement le:" >> $LOG
date >> $LOG
date +%s >> $LOG
#Et gestion des erreurs:
if [ -s $ERREUR ]; then echo "Il y a eu des erreurs !" >> $LOG
fi
fi
#On vérifie si on écrase les données long termes, mode auto uniquement
#Recupération de la date de la dernière sauvegarde, en secondes Unix
let "lastSauvegarde = `tail -n 1 $LOGLONG`"
let "delai = `date +%s` - lastSauvegarde"
if [ $delai -gt 2592000 ]
then
#On sauvegarde si le délai est de plus de 1 mois
rsync -aq --copy-links --progress --delete --filter "- .thumbnails/" --filter "- .Trash/" --filter "- *.tmp" --filter "- *.iso" --filter "- lost+found/" --filter "- .cache/" --filter "- .CACHE" --filter "- Cache/" --filter "- *.log" "$REPERTOIRE_SOURCE" "$REPERTOIRE_DESTINATION_LONG" >> /dev/null 2> $ERREURLONG
#Et mise à jour du fichier de log
echo "" >> $LOGLONG
echo "Dernière sauvegarde complète effectuée le:" >> $LOGLONG
date >> $LOGLONG
date +%s >> $LOGLONG
#Et gestion des erreurs
if [ -s $ERREURLONG ]; then echo "Il y a eu des erreurs !" >> $LOGLONG
fi
fi
else
exit 0
fi
#Fin du programme
exit 0
Voilà, n'hésitez pas à commenter ce code, il est très certainement améliorable (c'est en effet mon premier script bash !)
Dernière modification par Laserpithium (Le 28/06/2009, à 14:14)
Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+
Hors ligne
#2 Le 28/06/2009, à 12:23
- manuker
Re : Voici un script pour sauvegardes automatiques
Merci!
J'en utilise un similaire dans le principe mais beaucoup plus basique, je vais donc certaienement m'inspirer du tien.
Il correspond bien aux besoins de base d'une sauvegarde avec les gardes fous nécessaires, merci encore.
Ubuntu Precise v12.04.2 - 64bits (depuis 2013)
Hors ligne
#3 Le 28/06/2009, à 21:40
- Brunod
Re : Voici un script pour sauvegardes automatiques
Salut !
Bravo et merci pour le partage mais j'en profite pour demander un supplément (Il est tard et je n'ai pas encore épluché le script) :
- sauvegarde vers un répertoire distant : autre pc /nas
- sauvegarde avec rotation : 5 versions en rotation (sauve sur 1, 2... 5 puis écrase et remplace 1, 2 etc. avec trace de la date de la dernière mise à jour dans chacun de ces 5 répertoires)
Je dois mettre un système de ce type en place depuis un certains temps, mais je n'ai pas encore eu le temps de me pencher dessus et je rame surtout beaucoup encore avec rsync...
Aussi si ça pouvait t'inspirer, ça m'aiderait beaucoup
Sinon de toute manière, je m'inspirerai très fort de ton script !
Merci
Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis
Hors ligne
#4 Le 19/04/2012, à 18:26
- heronheronpetitpatapon
Re : Voici un script pour sauvegardes automatiques
Super je vais le mettre sur ma machine!
...Ubuntu Rocks....
Hors ligne
#5 Le 18/04/2013, à 20:49
- folkarys71
Re : Voici un script pour sauvegardes automatiques
Merci pour ce script, j'ai cependant une petite question. Mes fichiers perso son sur une autre partition séparée du fichier système et donc pas appelé "home".
Comment puis je modifié le script afin d’effectuer une sauvegarde de ses fichiers.
Merci d'avance
Hors ligne
#6 Le 18/04/2013, à 20:58
- Josepe36
Re : Voici un script pour sauvegardes automatiques
Bonsoir
Merci pour ce script, si je peux me permettre une suggestion, il serait prudent je pense de rajouter une routine de contrôl sur la taille de la destination.
En tout cas trés bien écris.
Développeur distribution Hybryde
www.hybryde.org
Hors ligne