Forum Programmation.shell Amélioration d'un script de bakup (rsync)

Posté par  . Licence CC By‑SA.
Étiquettes :
-1
11
mai
2013

Bonsoir à tous !!!!

J'aurais une question à vous poser. J'ai un script de backup, qui fonctionne parfaitement,
mais qui n'est pas très sexy sur un point : je voudrais pouvoir exclure ou inclure rapidement des répertoires
en faisant un tableau, dans lequel je met en commentaire ou non le répertoire, selon qu'il doit être exclu ou inclu
du processus de backup.

Voici mon code actuel :

    [bastien@zoulou /]$ cat backup_OS.sh 
    #!/bin/sh

    destination=/media/RAID5/BACKUP_OS

    START=$(date +%s)
    rsync --archive --delete --acls --xattrs --verbose /* $destination --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs,/var/lib/pacman/sync/*,/opt/*,/home/bastien/DOCUMENTS,/home/*/.thumbnails*,/tmp/*,/home/*/.mozilla,/home/*/.thunderbird}
    FINISH=$(date +%s)
    echo "total time: $(( ($FINISH-$START) / 60 )) minutes, $(( ($FINISH-$START) % 60 )) seconds"

    echo "SYNC"
    sync        

    rm $destination/Backup\ from\ *
    touch $destination/"Backup from $(date '+%A, %d %B')"
    [bastien@zoulou /]$ 

L'idéal serait d'avoir :

EXCLUDE_LIST="/dev/*,                    \
             /proc/*,                    \
              /sys/*,                    \
              /tmp/*,                    \
              /run/*,                    \
              /mnt/*,                    \
              /media/*,                  \
              /lost+found,               \
              /home/*/.gvfs,             \
              /var/lib/pacman/sync/*,    \
              /opt/*,                    \
              /home/bastien/DOCUMENTS,   \
              /home/*/.thumbnails*,      \
              /tmp/*,                    \
              /home/*/.mozilla,          \
              /home/*/.thunderbird" 

Ainsi je pourrais exclure de l'exclusion un répertoire via le caractère #.

Puis d'utiliser cette variable comme ceci :

rsync [.....blahblah....] --exclude=$EXCLUDE_LIST

Mais ça ne fonctionne pas !

Auriez-vous une idée ?

Bonne soirée les GNU/Linuxiens (et aussi aux GNU/Linuxiennes… :)

#### EDIT du 07 septembre 2013:####

J'ai trouvé une solution très propre et concise :

1. Fichier Backup_OS.sh :

[bastien@zoulou /]$ cat backup_OS.sh 
#!/bin/sh

destination=/media/RAID5/BACKUP_OS
rsync --archive --delete --acls --xattrs --verbose --exclude-from 'exclude.txt' / $destination
echo "SYNCING..........."
sync
touch $destination/"Backup from $(date '+%A, %d %B')"

2. Fichier Backup_DOCUMENTS.sh :

[bastien@zoulou /]$ cat backup_DOCUMENTS.sh 
#!/bin/sh

destination=/media/RAID5/BACKUP_DOCUMENTS
rsync --archive --delete --acls --xattrs --verbose /home/bastien/DOCUMENTS/ $destination
echo "SYNCING..........."
sync
touch $destination/"Backup from $(date '+%A, %d %B')"

3. Fichier ecxclude.txt :

[bastien@zoulou /]$ cat exclude.txt 
/dev/*
/proc/*
/sys/*
/tmp/*
/run/*
/mnt/*
/media/*
/lost+found
/home/*/.gvfs
/var/lib/pacman/sync/*
/opt/*
/home/bastien/DOCUMENTS
/home/*/.thumbnails*
/tmp/*
/home/*/.mozilla
/home/*/.thunderbird
[bastien@zoulou /]$ 

Si ça peut servir à quelqu'un…

  • # Ça m’intéresse aussi !

    Posté par  . Évalué à 3.

    J'ai un script du même genre avec le même problème.

    Sinon, pourquoi tu fais pas du backup incrémental avec rsync ? c'est cool et pas cher !

    Please do not feed the trolls

    • [^] # Re: Ça m’intéresse aussi !

      Posté par  . Évalué à 1.

      Hi,

      Même si je connais bien le principe de full-backup et incremental-backup, je n'avais jamais creusé avec rsync pour mon PC perso.

      Je vais me pencher dessus, car effectivement, depuis quelques jours je me disais que ce serait bien d'avoir quelques versions antérieures, just in case of….

      Merci !

      • [^] # Re: Ça m’intéresse aussi !

        Posté par  . Évalué à 3.

        Quelques version antérieurs et le fait que ça va vachement plus vite (sur le réseau en tout cas).

        Je ne montrerais pas mon script parce que j'en ai trop honte, mais basiquement j'ai fais ça :
        rsync --link-dir=last-backup $SOURCE $DESTINATION_DATE
        rm last-backup
        ln -s $DESTINATION_DATE last-backup

        Please do not feed the trolls

        • [^] # Re: Ça m’intéresse aussi !

          Posté par  . Évalué à 0.

          Euh pardon, dans mon dernier post, je voulais dire que je ne sais pas comment faire de SNAPSHOT avec rsync…
          Des incremental-backup, j'en fais tous les jours avec mon script… :)

  • # --exclude-from=/path/to/file

    Posté par  (site web personnel) . Évalué à 4.

    ça m'intéresse, actuellement j'utilise rsync avec le paramètre --exclude-from=/path/to/file avec un fichier file tel que :
    - .bak.
    - .bak/
    - *cache/

    - dump/*
    - *.gz

    wind0w$ suxX, GNU/Linux roxX!

  • # Here-document

    Posté par  (site web personnel) . Évalué à 4.

    Le procédé standard est de définir une fonction make_exclude_list du style

    make_exclude_list()
    {
       grep -v '^#' /etc/backup_OS/exclude.list
    }
    
    

    ou bien si tu préfères éviter d'avoir un fichier externe,

    make_exclude_list()
    {
       grep -v '^#' - <<EOF
    /dev/*
    …
    EOF
    }
    
    

    et tu définis ta variable EXCLUDE_LIST par

    EXCLUDE_LIST=`make_exclude_list`
    
    
    • [^] # Re: Here-document

      Posté par  . Évalué à 0.

      Hi,

      Marche po. :-(

      J'ai finalement opté pour la solution avec deux fichiers…

      [root@zoulou /]# cat /etc/backup_OS 
      /dev/*
      /proc/*
      /sys/*
      /tmp/*
      /run/*
      /mnt/*
      /media/*
      /lost+found
      /home/*/.gvfs
      /var/lib/pacman/sync/*
      /opt/*
      /home/bastien/DOCUMENTS
      /home/*/.thumbnails*
      /tmp/*
      /home/*/.mozilla
      /home/*/.thunderbird
      
      [root@zoulou /]# cat /backup_OS.sh
      #!/bin/sh
      
      destination=/media/RAID5/BACKUP_OS
      
      make_exclude_list()
      {
         grep -v '^#' /etc/backup_OS
      }
      
      EXCLUDE_LIST=`make_exclude_list`
      
      START=$(date +%s)
      rsync --archive --delete --acls --xattrs --verbose /* $destination --exclude={$EXCLUDE_LIST}
      FINISH=$(date +%s)
      echo "total time: $(( ($FINISH-$START) / 60 )) minutes, $(( ($FINISH-$START) % 60 )) seconds"
      
      echo "SYNC"
      
      sync
      
      rm $destination/Backup\ from\ *
      touch $destination/"Backup from $(date '+%A, %d %B')"
      
      [root@zoulou /]# ./backup_OS.sh
      sending incremental file list
      rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
      rsync: mkdir "/home/*/.thunderbird}" failed: No such file or directory (2)
      rsync error: error in file IO (code 11) at main.c(587) [Receiver=3.0.9]
      rsync: connection unexpectedly closed (9 bytes received so far) [sender]
      rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
      total time: 0 minutes, 0 seconds
      SYNC
      [root@zoulou /]# 
      
      

      Si vous aviez une idée, ça m'arrangerait.

      Merci,
      Bastien

      • [^] # Re: Here-document

        Posté par  (site web personnel) . Évalué à 3.

        C'est pas

        --exclude={$EXCLUDE_LIST}
        
        

        mais plutôt

        --exclude="${EXCLUDE_LIST}"
        
        

        Trois conseils: 1. pour le débogage (trace) utilise l'option x du shell ou place un echo devant les lignes que tu veux vérifier; 2. découpe le plus possible ton programme en fonctions, car tu peux tester chaque fonction individuellement pour t'assurer de son bon fonctionnement; 3. lis des scripts shells écrits par d'autres (par exemple les scripts du système), cela t'apprendra des tas de choses!

        • [^] # Re: Here-document

          Posté par  . Évalué à -1.

          I'm so sorry!

          MA_VIE
          Il y a des langages que je ne comprendrai jamais : Bash et MATLAB
          N'y a-t-il que le C que je suis capable de comprendre ?
          /MA_VIE

          J'utilise ça et ça ne fonctionne pas…

          [bastien@zoulou /]$ cat /etc/backup_OS 
          /dev/*,             \
          /proc/*,            \
          /sys/*,             \
          /tmp/*,             \
          /run/*,             \
          /mnt/*,             \
          /media/*,           \
          /lost+found,            \
          /home/*/.gvfs,          \
          /var/lib/pacman/sync/*,     \
          /opt/*,             \
          /home/bastien/DOCUMENTS,    \
          /home/*/.thumbnails*,
          /tmp/*,
          /home/*/.mozilla,
          /home/*/.thunderbird
          [bastien@zoulou /]$ cat backup_OS-ng.sh 
          #!/bin/sh
          
          destination=/media/RAID5/BACKUP_OS
          
          make_exclude_list()
          {
             grep -v '^#' /etc/backup_OS
          }
          
          EXCLUDE_LIST=`make_exclude_list`
          
          START=$(date +%s)
          rsync --archive --delete --acls --xattrs --verbose /* $destination --exclude="{$EXCLUDE_LIST}"
          FINISH=$(date +%s)
          echo "total time: $(( ($FINISH-$START) / 60 )) minutes, $(( ($FINISH-$START) % 60 )) seconds"
          
          echo "SYNC"
          
          sync
          
          rm $destination/Backup\ from\ *
          touch $destination/"Backup from $(date '+%A, %d %B')"
          [bastien@zoulou /]$ 
          

          Pour l'instant, je fais donc tourner "l'ancien" script, qui marche vraiment bien, à part que je ne peux pas exclure de folder facilement…
          Si quelqu'un(e) pouvait me donner un coup de main…

  • # Ccollect

    Posté par  (site web personnel) . Évalué à 0.

    Cela s'appelle Ccollect:

    http://www.nico.schottelius.org/software/ccollect/

    Il supporte les excludes, tous les arguments de rsync, logging, etc…

    Et simple a modifier car ecrit en bash.

Suivre le flux des commentaires

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