Forum Linux.debian/ubuntu Premier script bash pour backups, je tente un peu plus ambitieux

Posté par  . Licence CC By‑SA.
Étiquettes :
6
22
juil.
2025

Salut à tous,
Je me suis mis à bash il y a pas très longtemps après l'avoir découvert sur libre-octet et ce weeke end j’ai bricolé un petit script pour faire mes sauvegardes automatiquement sur un disque externe. L’idée c’est de ne plus avoir à y penser et de pouvoir dormir tranquille en cas de pépin. C’est encore simple mais j’ai essayé de faire les choses proprement, je vérifie que le disque est bien monté, je log un peu ce qu’il se passe, et j’utilise rsync pour garder les permissions et tout ça. Voilà ce que ca donne :

#!/bin/bash
# Répertoires source et destination
SRC="/home/user/Documents"
DEST="/mnt/backup/Documents"

# Fichier de log
LOG="/var/log/backup.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")

# Vérification que le disque est monté
if mountpoint -q /mnt/backup; then
    echo "[$DATE] Début du backup" >> "$LOG"

    rsync -av --delete "$SRC" "$DEST" >> "$LOG" 2>&1

    if [ $? -eq 0 ]; then
        echo "[$DATE] Backup terminé avec succès" >> "$LOG"
    else
        echo "[$DATE] Erreur pendant le backup" >> "$LOG"
    fi
else
    echo "[$DATE] Disque de backup non monté" >> "$LOG"
fi

Ca tourne bien en cron, j’ai mis ca tous les deux jours pour l’instant. Je suis sur que c’est perfectible donc si vous avez des remarques, conseils ou mauvaises pratiques à corriger, je suis curieux de vous écouter.
Merci

  • # Mes remarques

    Posté par  (site web personnel) . Évalué à 10 (+7/-0).

    • je vérifierai le script avec shellcheck https://www.shellcheck.net/ (existe en paquet dans les distributions)
    • suivant les contextes, certains préfèrent #!/usr/bin/env bash en shebang
    • j'aurais ajouté un set -eu -o pipefail au début pour s'éviter des problèmes plus tard
    • j'ai toujours du mal avec SRC d'un côté et DEST en 4 lettres de l'autre. Pourquoi pas DST dans ce cas, c'est cohérent en termes de pas de voyelles et c'est plus joli pour l'indentation
    • je préfère les printf à echo dès que les variables arrivent
    • j'aime bien expliciter les arguments dans les scripts, surtout sur des commandes que je n'utilise pas forcément tous les jours d'une part, et aussi pour les autres qui liraient le script (donc au lieu de -a je mettrais --archive par exemple). Les versions courtes c'est sympa quand on les écrit, mais moins quand on les lit (genre curl -sSLf).
    • la possibilité d'écrire dans le fichier de log n'est pas testée et on laisse rsync échouer s'il y a des soucis de permissions par exemple (pas forcément un souci)
    • on oscille entre français et anglais dans le code et les commentaires (bon en vrai j'aurais juste mis sauvegarde au lieu de backup)
    • la terminologie n'est pas cohérente entre "début" et "terminé" (donc commencé ou fin ?)
    • j'aurais mis des exit 0/1/2 dans les différents cas pour donner une information via le code de retour.
    • [^] # Re: Mes remarques

      Posté par  . Évalué à 4 (+3/-0). Dernière modification le 22 juillet 2025 à 16:09.

      Bonjour

      Il faudrait aussi actualiser la valeur de la variable DATE après la fin de la sauvegarde, sinon, la date de tous les messages envoyés dans backup.log sera toujours la même : celle du lancement du script.

      • [^] # Re: Mes remarques

        Posté par  . Évalué à 2 (+1/-0). Dernière modification le 23 juillet 2025 à 23:44.

        J'ajoute qu'en faisant la redirection des flux dans les toutes premières lignes de ton script :

        exec 1>> /var/log/backup.log
        exec 2>&1
        

        …tous les messages d'erreurs et les sorties standard des lignes de commande qui suivent dans le script seront envoyées dans le fichier /var/log/backup.log sans avoir besoin de le spécifier.

        • [^] # Re: Mes remarques

          Posté par  . Évalué à 1 (+0/-0).

          #!/usr/bin/env bash
          
          LOG="/var/log/backup.log"    # Fichier log
          MPT="/mnt/backup"            # Point de montage destination
          
          SRC="/home/user/Documents"   # Répertoire source
          DST="$MPT/Documents"         # Répertoire destination
          
          # Pour rediriger stdout et stderr en ajout dans le fichier log
          exec &>> "$LOG"
          
          # Fonction pour faire précéder les messages par la date heure
          dateMsg() {
              printf '%(%Y-%m-%d %H:%M:%S)T %s\n' -1 "$1"
          }
          
          # Pour séparer les logs dans le fichier
          printf '\n'
          
          # Si $MPT n'est PAS un point de montage
          if ! mountpoint -q "$MPT"; then
              dateMsg "Disque de backup non monté."
              exit
          fi
          
          dateMsg "Lancement du backup …"
          
          # Si l'exécution de rsync provoque une erreur
          if ! rsync --verbose --archive --delete "$SRC" "$DST"; then
              dateMsg "Erreur pendant le backup."
              exit
          fi
          
          dateMsg "Backup terminé avec succès."
    • [^] # Re: Mes remarques

      Posté par  (Mastodon) . Évalué à 3 (+0/-0).

      • je trouve le if mountpoint -q /mnt/backup; then un peu curieux, j'aurais plutôt vérifié que SRC et DEST existent.

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Mes remarques

        Posté par  (site web personnel) . Évalué à 2 (+0/-0).

        Au contraire, vérifier que la destination est bien un point de montage assure qu'on ne va pas faire la sauvegarde au mauvais endroit.

        Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN

        • [^] # Re: Mes remarques

          Posté par  (Mastodon) . Évalué à 3 (+0/-0).

          Certes, mais avoue que ce serait vraiment pas de bol d'avoir /mnt/backup/Documents existant sur le rootfs.

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Date ISO miam

    Posté par  (site web personnel, Mastodon) . Évalué à 5 (+4/-0).

    Une syntaxe courte et efficace que j'applique dès que je peux sur date :

    $ date -Is
    2025-07-22T16:51:05+02:00
    

    Ce qui signifie "format ISO-8601 avec une précision à la seconde".
    En bonus : pas d'espaces, donc plus pratique.

  • # backup ?

    Posté par  . Évalué à 5 (+3/-0).

    Même si chacun est libre d'avoir la définition qu'il veut de ce qu'est un backup, force est de reconnaître que

    rsync -av --delete

    ne correspond pas vraiment à la définition la plus courante.

    • [^] # Re: backup ?

      Posté par  . Évalué à 3 (+1/-0).

      Cela dépend surtout du reste du script. On peut parfaitement faire une sauvegarde incrémentale avec rsync (un nouveau dossier horodaté a à chaque fois et des liens en dur).

      • [^] # Re: backup ?

        Posté par  . Évalué à 6 (+4/-0). Dernière modification le 22 juillet 2025 à 19:33.

        Tout à fait, voir par exemple Timeshift., un excellent outil de backup basé sur rsync.

        Mais ma remarque était par rapport au script "de backup" présenté, qui plus est avec l'option --delete qui est la marque d'une synchronisation, pas d'un backup (au sens habituel du terme).

      • [^] # Re: backup ?

        Posté par  (Mastodon) . Évalué à 6 (+4/-1).

        Copier des hardlink n'est en rien un backup : l'info n'est présente qu'une fois. C'est pas du chipotage au niveau de terme, c'est vraiment que tu n'as pas fait de sauvegarde en faisant ça.

        De la même manière que l'option --delete fait que tes sauvegardes précédentes pouvant éventuellement être effacées… bin c'est plus des sauvegardes.

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: backup ?

          Posté par  . Évalué à 6 (+4/-0).

          Copier des hardlink n'est en rien un backup : l'info n'est présente qu'une fois. C'est pas du chipotage au niveau de terme, c'est vraiment que tu n'as pas fait de sauvegarde en faisant ça.

          Il ne s'agit pas de copier des hardlinks mais de créer des hardlinks de fichiers déjà sauvegardés existants et non modifiés. Regarde comment marche Timeshift. C'est une vraie sauvegarde (avec en plus une belle UX pour explorer le passé).

          Ce type de sauvegarde est cependant moins bien (en tous cas pour moi) que les borg, restic et autre, parce que la maille est au niveau fichier et non bloc (la déduplication est donc moins efficace), si on renomme un fichier ça va le dupliquer dans la sauvegarde suivante, si on déplace un fichier, idem.

          • [^] # Re: backup ?

            Posté par  (Mastodon) . Évalué à 4 (+2/-1).

            Oui je connais très bien j'en ai fait tourner un pendant des années chez moi.

            Je voulais dire que avoir 10 hardlink sur un fichier n'en fait pas 10 copies.

            En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: backup ?

          Posté par  . Évalué à 2 (+0/-0).

          Tu n'a pas compris ma piste d'amélioration du script du demandeur. :D
          Lire dans man rsync la description de l'option --link-dest

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.