Avis sur script rsync

Fermé
tom45 - Modifié le 9 déc. 2021 à 17:14
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 13 déc. 2021 à 16:57
Bonjour,

Je débute en linux et je galère un peu.

Je suis en train de faire un script qui synchronisera toutes les 5 minutes les datas d'un dossier qui se trouvent sur un windows vers une baie netapp . Les deux ne peuvent pas communiquer entre eux et je suis obligé de passer par un relais en linux centOS.

J'aimerais un avis sur mon script s'il vous plaît, et me dire si cela vous parait propre de faire comme cela ? Sur le linux relais, j'ai créé un
crontab
vers le script suivant que je vais exécuter toutes les 5 minutes

URL=\\\\ipnetapp/repertoir

mount -t cifs //ipwindows/dossieràrecup /mnt/montagesurlelinux/ -o credentials=/mnt/credentials

mount -t cifs ${URL} /mnt/montagenetapp -o credentials=/root/.cifs.credential

rsync -avz /mnt/montagesurlelinux/  /mnt/montagenetapp 

umount /mnt/montagesurlelinux/
umount /mnt/montagenetapp 


De plus j'aimerais ajouter un logger qui m'affiche si il y a eu une erreur dans la synchros mais alors là je bloque
A voir également:

4 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 9 déc. 2021 à 17:32
Bonjour,

À première vue, le script semble correct, mais il est améliorable :
  • Je te recommande de choisir des noms de points de montage un peu plus parlants et un peu plus jolis.
  • D'après
    man rsync
    et cette discussion, tu n'as pas besoin de monter explicitement les deux partages distants s'ils sont accessibles en
    ssh
    . Mais comme tes partages sont accédés via samba, tu dois effectivement les monter.
  • Évite aussi les caractères accentués, et vérifie que les points de montage existent (en les créant si nécessaire avec
    mkdir -p
    ). Le chemin vers les credentials windows est bizarre.
  • À toi de voir si tu veux monter / démonter les volumes distants à chaque fois. Tu peux aussi choisir de les monter / démonter au démarrage et à l'extinction de ton ordinateur en les référençant dans
    /etc/fstab
    .
  • Au niveau des logs, le plus simple est de rediriger la sortie d'erreur dans un fichier de ton choix. Derrière chaque commande, il suffit d'ajouter
    &2 >> /var/log/toto.log
    . Une version plus évoluée consiste à écrire une petite fonction qui insère en début de ligne de log la date actuelle (voir la fonction
    log_pipe
    dans cette discussion).


Voici à quoi ça pourrait ressembler

#!/bin/sh

URL_NETAPP="\\\\ipnetapp/repertoire"
MNT_NETAPP="/mnt/netapp "
CRED_NETAPP="/root/.cifs.credential"
URL_WINDOWS="//ipwindows/dossier_a_recuperer"
MNT_WINDOWS="/mnt/windows/"
CRED_WINDOWS="/mnt/credentials" # Bizarre
LOG_FILE="/var/log/toto.log"

log_pipe(){
    while read line; do
        echo [$(date +%Y-%m-%d\ %H:%M:%S)] "$line" >> "$LOG_FILE"
    done
}

mkdir -p "$MNT_WINDOWS" "$MNT_NETAPP"
mount -t cifs  "$URL_WINDOWS" "$MNT_WINDOWS" -o credentials="$CRED_WINDOWS" 2>&1 | log_pipe
mount -t cifs "$URL_NETAPP" "$MNT_NETAPP" -o credentials="$CRED_NETAPP" 2>&1 | log_pipe
rsync -avz "$MNT_WINDOWS" "$MNT_NETAPP" 2>&1 | log_pipe
umount "$MNT_WINDOWS"
umount "$MNT_NETAPP"


Bonne chance
0
Merci pour tes réponses très clair et instructives

Je te recommande de choisir des noms de points de montage un peu plus parlants et un peu plus jolis.

oui c'était pour modifier les noms mais j'ai des noms plus propres dans mon scripts


D'après man rsync et cette discussion, tu n'as pas besoin de monter explicitement les deux partages distants s'ils sont accessibles en ssh. Mais comme tes partages sont accédés via samba, tu dois effectivement les monter.
intéressant je vais regarder de ce coté là je suis justement en train de configurer open ssh sur les postes windows

Évite aussi les caractères accentués, et vérifie que les points de montage existent (en les créant si nécessaire avec mkdir -p).

Le chemin vers les credentials windows est bizarre.
je l'ai changé et mis dans un dossier caché

À toi de voir si tu veux monter / démonter les volumes distants à chaque fois. Tu peux aussi choisir de les monter / démonter au démarrage et à l'extinction de ton ordinateur en les référençant dans /etc/fstab.
Monter / démonter dans mon ca je préfère car je suis sur un serveur linux plus propre

Au niveau des logs, le plus simple est de rediriger la sortie d'erreur dans un fichier de ton choix. Derrière chaque commande, il suffit d'ajouter &2 >> /var/log/toto.log. Une version plus évoluée consiste à écrire une petite fonction qui insère en début de ligne de log la date actuelle (voir la fonction log_pipe dans cette discussion).


Je n'ai pas mis les chemins en variable car potentiellement je vais avoir 6 ou 7 pc à sauvegarder dans le même script, j'ai fait une ligne pour chacun avec ce qui change à chaque fois .

Voila ce que donne mon code :
J'ai ajouté un test pour qu'il n'y ai pas de doublon, si le répertoire est présent c'est que le test n'est pas fini du coup je ne lance pas le script si c'est déjà en cours . Je ne sait pas si il existe une façon plus propre ?


#!/bin/bash
##Script de Sauvegarde des data des 5 PC
##Ne pas modifier le script

#fichier de log
LOG_FILE="/var/log/5PC.log"

log_pipe(){
    while read line; do
        echo [$(date +%Y-%m-%d\ %H:%M:%S)] "$line" >> "$LOG_FILE"
    done
}

#Fonction d'erreur si une erreur il affichera un message d'erreur sous /var/log/messages
function error()
{
        logger "${LOG} -> ${1}"
        exit 1
}

#Test si le script n'est pas déja en cours 
if [ -e /root/5PC/testduscript.txt ]
then
    echo "Mon fichier existe"
 exit
else
    echo "Mon fichier n'existe pas"
 cat /root/5PC/testduscript.txt
fi


##--------------------------------------------------------------------------------------------------------------
##Pc1
#Fonction de sauvegarde des données du PC1
# L'option -p evite les erreurs si le répertoire est déjà présent.
mkdir -p /mnt/Montagewindowspc1 || error "Impossible de crée le répertoire '/mnt/Montagewindowspc1'"
mkdir -p /mnt/netappc1 || error "Impossible de crée le répertoire '/mnt/netappc1'"
mount -t cifs //ippc1/Reports /mnt/Montagewindowspc1  -o credentials=/root/5PC/.credentials 2>&1 | log_pipe
mount -t cifs \\\\ipnetap/chemin /mnt/netappc1 -o credentials=/root/.cifs.credential 2>&1 | log_pipe

rsync -avz /mnt/Montagewindowspc1 /mnt/netappc1 2>&1 | log_pipe

umount /mnt/Montagewindowspc1 
umount /mnt/netappc1

##--------------------------------------------------------------------------------------------------------------
##PC2/
#Fonction de sauvegarde des données pc 2
# L'option -p evite les erreurs si le répertoire est déjà présent.
mkdir -p /mnt/Montagewindowspc2 || error "Impossible de crée le répertoire '/mnt/Montagewindowspc2'"
mkdir -p /mnt/netappc2 || error "Impossible de crée le répertoire '/mnt/netappc2'"
mount -t cifs //ippc1/Reports /mnt/Montagewindowspc2  -o credentials=/root/5PC/.credentials 2>&1 | log_pipe
mount -t cifs \\\\ipnetap/chemin /mnt/netappc2 -o credentials=/root/.cifs.credential 2>&1 | log_pipe

rsync -avz /mnt/Montagewindowspc2 /mnt/netappc2 2>&1 | log_pipe

umount /mnt/Montagewindowspc2 
umount /mnt/netappc2

##--------------------------------------------------------------------------------------------------------------
##Pc3
#Fonction de sauvegarde des données du PC3

##--------------------------------------------------------------------------------------------------------------

#Supression du fichier de test 
rm /root/5PC/testduscript.txt 
0
j'ai une autre question, peut être un peu bête comme question désolé.

si je fait un mount sur le mon pc linux qui ne sert que de passerelle entre le windows et mon netapp est-ce que cela va prendre de l'espace disque sur le pc linux ?

j'ai 25 go par ordinateur :o
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
11 déc. 2021 à 14:39
Non, c'est "en mémoire". En réalité linux t'expose une arborescence de fichiers qui permet de ne plus se soucier du périphérique, du partage réseau et du système de fichiers sous-jacent. Il y a même des fichiers qui n'ont aucune existence physique sur le disque dur (typiquement
/proc
permet d'interroger le noyau linux) et il en va de même pour les partages réseaux.
0
ouf ça me sauve la vie car je n'ai que 70 go sur mon linux . merci pour l'info .

Avez-vous vu mon code au dessu ? pensez vous qu'il est clean ? je l'ai testé il fonctionne mais c'est plus un avis clean/amélioration qu'il me faudrait svp
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
13 déc. 2021 à 16:57
Ouf ça me sauve la vie car je n'ai que 70 go sur mon linux.

Oui, pour clarifier ma réponse, sous linux, il faut voir l'arborescence des fichiers exposés comme une sorte d'API pour accéder à différentes sources de données (noyau, disques, devices, sockets ...). Ce qui signifie que la présence d'un fichier dans l'arborescence n'a pas d'implication sur le stockage. Ce sont les
mount
qui détermine où est stocké physiquement un fichier (quand il en a une, ce qui exclue par exemple la plupart des fichiers dans
/proc
).

pensez vous qu'il est clean ?
  • Ça dépend. Par exemple la fonction
    error
    utilise la commande
    logger
    ce qui signifie que le fichier de log sera
    /var/log/syslog
    . Est-ce que tu veux faire, je ne sais pas, mais ça n'est pas cohérent avec la fonction
    log_pipe
    . Il serait plus logique que ton script n'écrire que dans un fichier de log (qui à adapter
    log_pipe
    pour utiliser
    logger
    à la place d'
    echo
    ).
  • Je recommande d'écrire les messages d'erreur plutôt en anglais.
  • En terme de propreté de code, les points de montages et adresses mises en jeu devrait être stockées dans des variables, ce qui permettra de corriger plus facilement le script si elles viennent à changer.
  • Si j'ai bien compris le passage qui suit, tu veux garantir qu'au plus une instance de ton script à un moment donné.


#Test si le script n'est pas déja en cours 
if [ -e /root/5PC/testduscript.txt ]
then
    echo "Mon fichier existe"
 exit
else
    echo "Mon fichier n'existe pas"
 cat /root/5PC/testduscript.txt
fi


... Généralement on crée plutôt un fichier vide dans
/var/lock
pour être conforme à la FHS. Comme expliqué dans cette discussion, tu peux utiliser
flock
.

Bonne chance
0