[Résolu] Script shell basique de backup avec "rsync"

Bonjour,

J’essaie de réaliser quelque chose de très simple avec un script mais comme je débute, je bloque sur des choses simples.

J’aimerais juste vérifier si un disque est monté sur le dossier /backup avant d’exécuté des commandes.

J’ai rédigé ceci, mais sh ne semble pas digérer mon “grep”… et il y a quelque chose que je n’ai pas encore compris avec l’utilisation des string

#!/bin/sh if [mount | grep "/backup"]>0 then echo "démarrer backup" #ici vient ma commande pour démarrer le backup else echo "message d'erreur" fi

J’ai posté ici, car j’ai pensé que ce n’était pas de la programmation pure, vu que c’est un script.

Merci pour votre aide

.

Salut, salut,

C’est “juste” un problème de syntaxe…

#!/bin/sh if mount | grep "/backup" > 0 ; then echo "démarrer backup" #ici vient ma commande pour démarrer le backup else echo "message d'erreur" fiDevrait mieux marcher… :wink:
J’ai “testé” en montant une partoche sur /backup … ça me dit “démarrer backup”… en démontant, ça me dit “message d’erreur”… :wink:

Un petit “tuto” sur les scripts sh:
http://lea-linux.org/cached/index/Dev-shell_script.html
(c’est celui le 1er que j’ai trouvé avec une recherche google “script sh”, et en cherchant un peu, avec les exemples… :wink: )

Bon courage à tous et toutes… :smt006

édit: :blush: ousp… j’avais pas vu le post de tellmewhy… toutes mes confuses… :blush:

Ou bien simplement un test sur un répertoire monté:

if [ -d /mnt/ton/rep-monte/ ]; then # code si oui else # code sinon fi

.

[quote=“ripat”]if [ -d /mnt/ton/rep-monte/ ]; then # code si oui else # code sinon fi[/quote]C’est une méthode “propre” pour tester l’existance d’un répertoire, et non si il est “monté”, dans “son” cas, je ne pense pas que celà puisse “marcher” si le répertoire n’est pas créé “à la volé” lors du montage vers /backup/ mais “avant” (je viens de faire le test, si le repertoire /backup existe mais que rien n’est monté dedans, on obtient le message “démarrage du backup”… :wink: )

[quote=“tellmewhy”]Pas de souci, rien ne vaut la diversité. :wink:[/quote] :wink: par contre, il me semble qu’il ne doit pas y avoir de “;” entre “then” et “fi” … :wink: :blush:
Tes liens ont l’air pas mal… je vais garder ça sous le coude… :wink:

Bon courage à tous et toutes… :smt006

.

Merci pour ces précisions et le lien tellmewhy (j’avais pas pensé au “test” en ligne de commande :blush: ).

Bon courage à tous et toutes… :smt006

.

Tu dois, bien sûr, mettre un sous-répertoire (ou fichier) dont tu connais l’existence en aval du point de montage. Ce dernier existe effectivement toujours que le mount soit fait ou pas, (sauf dans le cas de autofs ou les points de montages sont créés automatiquement).

Si tu as un mount:
//ntserver2/ssrep on /mnt/smb type smbfs

tu testes [ -d /mnt/smb/un-repertoire-de-ntserver2-ssrep/ ]

C’est juste pour faire court et éviter deux commandes (mount et grep). Maintenant, si tu ne connais pas le contenu de ton point de montage, tu n’as pas le choix. Une autre méthode dans ce cas:

if grep -q '/backup' /proc/mounts;then # code si oui else # code sinon fi Ou, pour les fanatiques des one liner:

grep -q '/backup' /proc/mounts && echo "monté" || echo "pas monté" :wink:

Merci pour ces précisions ripat :wink: … Tes méthodes sont plus “propres” en effet… j’ai “juste” essayé de “corriger” la syntaxe de son script (sans chercher plus loin… :blush: )

Bon courage à tous et toutes… :smt006

La forme condition && si vrai || sinon c’est pour rire hein! Je n’ai jamais trouvé les opérateurs de liste de commandes && et || ni très commodes ni très lisibles. Mais ça fait court et conçis. Et ça en jette :wink:

Je les utilise de temps en temps en ligne de commande pour rapidement tester une condition mais jamais dans un script.

[quote=“ripat”]La forme condition && si vrai || sinon c’est pour rire hein! Je n’ai jamais trouvé les opérateurs de liste de commandes && et || ni très commodes ni très lisibles. Mais ça fait court et conçis. Et ça en jette :wink:

Je les utilise de temps en temps en ligne de commande pour rapidement tester une condition mais jamais dans un script.[/quote] :wink: Je préfère aussi les formes “explicites”… avec la notation “condensée qui fait pro”, celà devient vite illisible… le mal de tête quand tu reprends un (vieux) script… :laughing:

Bon courage à tous et toutes… :smt006

Super !

Merci beaucoup à tous pour toutes ces précieuses info :smiley:

Je peux maintenant partir équipé de bonnes armes sur le champ de bataille des scripts. Espérons que mon armure (de courage) tiendra le coup :wink:

Une dernière question. J’avais cherché dans divers tuto et cours sur les scripts des exemples ou de explications sur la manière d’affecter à une variable le résultat text d’une commande , sans succès.
Peut être trouverais-je mon bonheur dans ces nouveaux tutos que vous m’avez conseillés ?

Enfin si qqun sait comment faire ça serait sympa :wink:

Je pensais à un truc du style :

Voili voilou

Il faut entourer la commande par des guillemets ().

Pourquoi n’utilises-tu pas le globbing du bash avec ses “wild cards”?

Oki :wink: je connaissais pas ces trucs avec : et $( )
Merci :smiley:

[quote=“tellmewhy”]Bonsoir dougstar7, :slightly_smiling:

Un exemple en me basant sur ton idée :

:~$ mount | grep home &>/dev/null;if [ $? -eq 0 ];then echo oui; else echo non;fi
oui

[/quote]

Concernant la variable “?”, j’ai une question intéressante,
j’ai lu l’explication sur cette variable et je me demandais si elle était propre à la session de shell dans lequel le script est lancée ou si elle est globale.

Et même si elle est locale, est-ce qu’il n’y a quand même pas un risque de corruption de celle-ci par un autre process tournant en toile de fond.
J’entends par là, dans le cadre d’un système vraiment multi-taches, les processus s’exécutent en parallèle.

On a donc aucun moyen d’être sûr que la variable ? ait bien une valeur en relation avec la commande (grep) qu’on a exécuté juste avant le teste qu’on effectue dessus (avec un if ou autre…).

Est-ce que ce que je dis à du sens ou je suis complètement dans le bas-fossé ? :wink:

.

Merci beaucoup pour ces précieuses info Tellmewhy, ainsi qu’à vous tous pour vos conseils.

J’ai décidé de ne pas utilisé la varaible $? du code de sortie afin de garantir le fonctionnement du script même en cas d’exécution de plusieurs scripts en parallèles sur le même terminal.

Afin de faire bénéficier la communauté de ce que je fais, je laisse ici à tout hasard le code de mon script de backup rsync que j’ai bien amélioré depuis.

Rsync est une excellente solution de backup pour nos systèmes Linux.
J’ai pris le script de base proposé dans le tuto ici :http://www.linuxfocus.org/Francais/March2004/article326.shtml
et je l’ai retravaillé pour automatiser la tache sur mes disques USB externes.

Le script monte le disque USB connecté à l’aide de son LABEL, comme ça plus de problème avec un UUID qui change ou un identifiant sda ou sdb qui change.
Il suffit de nommer son disque lors du formatage ou de le renommer avec “tune2fs -L” et “tune2fs -l” pour voir les info de votre disque. (Gafez-vous avec les majuscules ! Linux est sensible à ça et j’ai eu quelques soucis avec le label de mes disque “Backup1” ou “backup1”. En plus il faut carrément débrancher physiquement votre disque à chaque fois que vous changez son Label si non /dev/disk/by-label/ vous donne des informations qui ne sont pas à jour.)
Ensuite le script rédige un rapport de backup avec des statistiques sur les disques et l’envoie par e-mail.
Je fais un “mdstat” car j’ai un RAID logiciel, mais vous pouvez effacer sans problème les lignes concernées.
Pour terminer il démonte le disque de backup.

[code]#!/bin/sh

#########################################################

Script de bakcup incrémental rsync

Adapté du script trouvé sur rsync.samba.org

Créé par Brian Hone 24-3-2002

http://www.linuxfocus.org/Francais/March2004/article326.shtml

Adapté par Dougstar7 11-6-2008

Ce script est distribué gratuitement sous licence GPL

Pour que ce script fonctionne correctement, il vous faut,

au minimum, avoir installé les paquets : rsync et ssmtp,

et avoir configuré /etc/ssmtp/ssmtp.conf.

Vous pouvez utiliser sendmail ou postfix (ou autre…) pour

envoyer les e-mails, mais ils sont plus compliqué à configurer

Le log du dernier backup se trouve sous : /tmp/log-backup.txt

#########################################################

##################################

Configurez ces options

##################################

###################################

Adresse E-mail pour le status du backup

- un rapport du backup et de l’état des disques

est envoyé à ce(s) adresse(s) e-mail

(Ã séparer par un espace si il y en a plusieures)

###################################
MAILADDR="votreEmail@votreFAI.ch"

###################################

HOSTNAME

- C’est le nom de votre machine backupée

(Usage purement informatif)

###################################
HOSTNAME=nom-de-mon-serveur

###################################

Le dossier à backuper

- C’est le chemin du dossier dont vous

désirez réaliser un backup

(ne pas oublier de mettre un “/” à la fin

pour aviter de copier le dossier lui-même)

###################################
BACKUPDIR=/Donnees/

###################################

Label des 2 disques externes possibles utilisés pour le backup

voir commandes : e2label, tune2fs -L

Si les deux disques sont présents, le backup est réalisé sur le premier

Ces noms servent également de chemins pour définir où seront

stockées les données backupées.

Un “/” sera ajouté automatiquement devant.

###################################
ARCHIVEROOT1=Backup1 #USB disk 1 Western digital
ARCHIVEROOT2=Backup2 #USB disk 2 Seagate

############################################

Depuis ici, il est préférable de ne rien

rien changer. A moins que vous ne

sachiez exactement ce que vous faites

############################################

Dossier qui contient nos données backupées

CURRENT=Principal

Dossier dans lequel nous enregistrons

uniquement les données qui ont changé (mode incrémental).

INCREMENTDIR=date +%Y-%m-%d

Heure de début du backup

BACKUP_BEG_DATE=date +%T

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

Pour éviter de faire un backup sur un dossier de / au lieu d’un des deux disques USB externes montés/à monter

if grep -q ‘/backup1’ /proc/mounts;then
ARCHIVEROOT="/$ARCHIVEROOT1"
elif grep -q ‘/backup2’ /proc/mounts;then
ARCHIVEROOT="/$ARCHIVEROOT2"
elif [ -h /dev/disk/by-label/$ARCHIVEROOT1 ];then
ARCHIVEROOT="/$ARCHIVEROOT1"
mount -L $ARCHIVEROOT1 $ARCHIVEROOT
elif [ -h /dev/disk/by-label/$ARCHIVEROOT2 ];then
ARCHIVEROOT="/$ARCHIVEROOT2"
mount -L $ARCHIVEROOT2 $ARCHIVEROOT
else
echo"Aucun des deux disques USB externe de backup n’est monté sur $ARCHIVEROOT1 ou sur $ARCHIVEROOT2. Backup annulé !"|tee /tmp/log-backup.txt
exit
fi

Pour être sûr que notre arborescence de backup existe

install -d $ARCHIVEROOT/$CURRENT

options à passer à rsync

OPTIONS="–force --ignore-errors --delete --backup --backup-dir=$ARCHIVEROOT/$INCREMENTDIR -av"

notre fonction rsync

do_rsync()
{
rsync $OPTIONS $BACKUPDIR $ARCHIVEROOT/$CURRENT 2>&1 |tee /tmp/log-backup.tmp
}

notre fonction de rapport post-backup rsync

do_accounting()
{

end time of the backup

BACKUP_END_DATE=date +%T
echo “Rapport de backup $INCREMENTDIR de $HOSTNAME: ($BACKUP_BEG_DATE)”>/tmp/rsync_script_tmpfile
echo “Debut : $BACKUP_BEG_DATE”>>/tmp/rsync_script_tmpfile
echo “Fin : $BACKUP_END_DATE”>>/tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
echo “# Etat des disques RAID 1”>>/tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
cat /proc/mdstat >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
echo “# Taille des backups sur le disque”>>/tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
du -sh $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
echo “# Taux d’utilisation des disques”>>/tmp/rsync_script_tmpfile
echo “################################################”>>/tmp/rsync_script_tmpfile
df -h >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile

echo "Mail $MAILADDR -s Rapport de backup de $HOSTNAME - $INCREMENTDIR < /tmp/rsync_script_tmpfile"
Mail $MAILADDR -s “Rapport de backup de $HOSTNAME - $INCREMENTDIR” < /tmp/rsync_script_tmpfile
echo "cp /tmp/rsync_script_tmpfile /tmp/log-backup.txt"
cp /tmp/rsync_script_tmpfile /tmp/log-backup.txt
echo "cat /tmp/log-backup.tmp >> /tmp/log-backup.txt"
cat /tmp/log-backup.tmp >> /tmp/log-backup.txt
echo "rm /tmp/log-backup.tmp"
rm /tmp/log-backup.tmp
echo "rm /tmp/rsync_script_tmpfile"
rm /tmp/rsync_script_tmpfile
}

Pour avertir si le dossier à backuper n’est pas référencé de manière correcte

if [ -d $BACKUPDIR ]; then

now the actual transfer

do_rsync && date && do_accounting
else
echo “Ne trouve pas le dossier à backuper $BACKUPDIR. Backup annulé”|tee /tmp/log-backup.txt; exit
fi

Attendre que le disque soit prêt

sleep 30s

Démonter par sécurité le dossier de backup.

En cas de mise en veille non demandée du disque USB,

des données risquent d’être perdues.

echo “umount $ARCHIVEROOT”|tee -a /tmp/log-backup.txt
umount $ARCHIVEROOT 2>&1 |tee -a /tmp/log-backup.txt
[/code]

Voilà bon chance à ceux qui backup. Vous verrez “rsync” c’est super :wink: