Backup Skript automatisch ausführen mit udev

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Jonny Mulandros, 11.06.2009.

  1. #1 Jonny Mulandros, 11.06.2009
    Jonny Mulandros

    Jonny Mulandros Doppel-As

    Dabei seit:
    12.05.2007
    Beiträge:
    128
    Zustimmungen:
    0
    Ort:
    Kiel
    Hallo liebes Unixboard,

    ich bastel gerade an meiner Backup Lösung mit Rsync in Kombination mit einer Udev Regel.

    Ich bin schon so weit, dass ich eine funktionierende Udev Regel erstellt habe, die beim einstecken meiner externen USB Platte folgendes Skript aufruft:

    Code:
    #!/bin/bash
    
    mount /dev/backup
    sh /home/sebastian/Scripts/backup.sh
    eject /dev/backup
    Dieses Skript habe ich unter /usr/local/bin/backup gespeichert und ausführbar gemacht. Es mountet die USB-Platte, führt das Backup Skript aus und bindet sie anschliessend normal ins System ein.

    Hier ist das Backup Skript:

    Code:
    #!/bin/bash
    # Simple backup with rsync
    # SOURCES and TARGET must end with slash
    SOURCES="/home/sebastian/ /media/Data/"
    TARGET="/media/Backup/"
    LOGFILE="/home/sebastian/.backup.log"
    EXPIREDAYS=14
    RSYNC="--delete --include=.conkyrc --exclude=.* --exclude=*.*~ --exclude=Downloads --exclude=Desktop --exclude=RECYCLE.BIN --exclude=System Volume Information"
    #SSHUSER="user"
    #SSHHOST="hostname"
    #SSHPORT=22
    
    ### do not edit ###
    
    `/bin/date > $LOGFILE`
    if [ -e $TARGET ]; then
     LASTBACKUP=`/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1  `
    fi
    TODAY=$(/bin/date +%d%m%y)
    if [ $EXPIREDAYS -gt 0  ]; then
      EXPIRED=`/usr/bin/find $TARGET[[:digit:]]* -maxdepth 0 -ctime +$EXPIREDAYS  2>> $LOGFILE`
      for EX in `/bin/echo $EXPIRED`
      do
        /bin/echo  "rm -rf $EX " >> $LOGFILE
        `/bin/rm -rf $EX`
      done
    fi
    for SOURCE in `/bin/echo $SOURCES`
    do
      if [ "$LASTBACKUP" ]; then
        INC="--link-dest=$LASTBACKUP$SOURCE"
      fi
      if [ "$SSHUSER" ] && [ "$SSHHOST" ] && [ "$SSHPORT" ]; then
        SSH="ssh -p $SSHPORT -l $SSHUSER";
        SOURCEDIR="$SSHHOST:$SOURCE";
      else
        SOURCEDIR=$SOURCE;
      fi
      `/bin/mkdir -p $TARGET$TODAY$SOURCE` >> $LOGFILE
      echo "/usr/bin/rsync -e \"$SSH\" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE "  >> $LOGFILE 2>> $LOGFILE;
      /usr/bin/rsync -e "$SSH" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE  >> $LOGFILE 2>> $LOGFILE;
    done
    Udev-Regel /etc/udev/rules.d/07.usb.storage.custom.rules:
    Code:
    # USB-Festplatte für inkrementelle Backups
    
    BUS=="usb", KERNEL=="sd?1",SYSFS{serial}=="DEF10000DF72172",SYSFS{idProduct}=="6830",SYMLINK+="backup",RUN+="/usr/local/bin/backup"
    Hier zur Info meine fstab:
    Code:
    # /etc/fstab: static file system information.
    #
    # Use 'vol_id --uuid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    # / was on /dev/sda2 during installation
    UUID=cedb8e71-0790-4a02-a303-f63045e13092 /               ext3    relatime,errors=remount-ro 0       1
    # swap was on /dev/sda5 during installation
    UUID=f2d687b9-f9f9-45d9-a0de-d1e576cd5108 none            swap    sw              0       0
    /dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
    
    ## Selbst eingetragen ##
    
    # Windows HD
    /dev/sda1	/media/Windows	ntfs-3g	defaults,noatime	0	0
    
    # Data HD
    /dev/sda3	/media/Data	ntfs-3g	defaults,noatime	0	0
    
    # Backup HD
    UUID=52c1a2b5-af83-49a3-bdf7-769d2c8e492c	/media/Backup	ext3	noauto,user,defaults	0	0
    Das alles funktioniert auch soweit ganz gut, nur habe ich das Problem, das er beim ersten Skript das Backup auch ausführt, wenn das mounten nicht klappen sollte, und das Backup in das existierende Mount-Verzeichnis schreib, was dann sehr schnell meine Root-Partition volllaufen lässt.

    Ich würde gerne umsetzen:

    1. Er prüft im ersten Skript, ob die Platte wirklich eingehängt ist, und bricht ansonsten mit einer Fehlermeldung ab bzw. erstellt eine log-Datei mit dem Fehler

    2. Das Backup Skript sendet über notify-osd eine Meldung, wenn das Backup startet und ob es erfolgreich war oder ein Fehler passiert ist.

    Ich kenne mich leider mit Shell Skripting so gut wie gar nicht aus und hoffe dass ihr mir bei meinem Problem weiterhelfen könnt.

    Vielen Dank schonmal im vorraus...
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 HeadCrash, 11.06.2009
    HeadCrash

    HeadCrash Routinier

    Dabei seit:
    16.05.2009
    Beiträge:
    482
    Zustimmungen:
    1
    Ort:
    Bayern
    Mahlzeit,

    ganz spontan um zu prüfen ob ein mount vorhanden ist:

    Code:
    mount | grep -q "media/backup" 
    # bzw in deinem Fall wohl eher die eingetragene uuid
    result=$?
    
    if [ $result -eq 0 ]; then 
       echo "backup is mounted, start backupjob"
    else 
       echo "backup is not mounted, kill backupjob"
       exit 1
    fi
    
    Da du das ganze gelogt haben willst entweder mit Asugabeumleitung in eine beliebige Datei oder anstelle von "echo" den Befehl "logger" verwenden.

    mfg
    HeadCrash
     
  4. Gast1

    Gast1 Guest

    Ganz einfacher Ansatz:

    Wenn man schon udev beim Einstöpseln ein Script ausführen lässt, könnte man auch das Anlegen des Mountpunktes und anschliessendes Löschen des selbigen ins Script packen und den fstab-Eintrag ganz weglassen.

    Durch eine Verknüpfung des Mountvorgangs und des anschliessenden Backups mittels "&&" könnte man verhindern, daß das Backup vor dem erfolgreichen Mounten loslegt und eventuelle Timingprobleme (mounten dauert zu lange) sind ausgeschlossen.

    Damit würde das Script dann auch portierbar auf andere Systeme und man hat keine "Leiche" in /media rumliegen, die ggf. HAL durcheinanderbringt.

    Ich würde sogar so weit gehen, einen ganz "eigenen" Mountpunkt (/my_backup z.B.) anlegen zu lassen, damit es niemals mit einem schon vorhandenen Verzeichnis im System Kollisionen geben kann.
     
  5. #4 Jonny Mulandros, 11.06.2009
    Jonny Mulandros

    Jonny Mulandros Doppel-As

    Dabei seit:
    12.05.2007
    Beiträge:
    128
    Zustimmungen:
    0
    Ort:
    Kiel
    Super, vielen Dank für eure Antworten!

    Also ich habe eure Tipps mal folgendermaßen umgesetzt:

    Code:
    #!/bin/bash
    
    mkdir /media/MakeBackup &&
    
    mount -t ext3 /dev/backup /media/MakeBackup &&
    
    mount | grep -q "/media/MakeBackup"
    result=$?
    
    if [ $result -eq 0 ]; then 
        #export DISPLAY=:0.0 && /usr/bin/notify-send "Backup" "is running in Background"
       sh /home/sebastian/Scripts/backup.sh &&
       umount /dev/backup &&
       rmdir /media/MakeBackup
    else 
        #export DISPLAY=:0.0 && /usr/bin/notify-send "Backup" "Backup-HD not mounted, aborting Backup!"
       rmdir /media/MakeBackup
       exit 1
    fi
    
    Das klappt wunderbar, so kann was das Mounten angeht ja erstma nix schiefgehen, da der Ordner ja erst erstellt wird!

    Jetzt würde ich noch gerne entsprechende Meldungen über notify-send ausgeben (Ansatz ist schon im Skript, allerdings auskommentier),
    nur leider funktionieren die Befehle im Skript nicht, auf der Konsole manuell eingegeben allerdings schon.
    Hängt wahrscheinlich damit zusammen, dass das Skript als Root ausgeführt wird?
    Google sagte zu dem Thema nur, das man notify wohl noch das ausgebende Display mitteilen muss, allerdings schlugen meine Versuche damit bisher fehl.
    Es wäre schön wenn mir jemand bei diesem Problem weiterhelfen könnte...

    Gruß

    Jonny
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Backup Skript automatisch ausführen mit udev

Die Seite wird geladen...

Backup Skript automatisch ausführen mit udev - Ähnliche Themen

  1. Backup Skript Erläuterung

    Backup Skript Erläuterung: Hallo, ich möchte gerne die Shellprogrammierung lernen und habe mir dazu ein vorhandenes Skript vorgenommen. In diesem Skript gibt es eine...
  2. Backup-Skript (aus c't 7/2006)

    Backup-Skript (aus c't 7/2006): Ich habe ein Problem mit einem Skript aus der c't, das mysql-Datenbanken sichern soll und im Rahmen eines (dirvish-)cronjobs läuft. Das Problem...
  3. Hilfe bei Backupskript

    Hilfe bei Backupskript: #!/bin/bash ### ### Configuration ###
  4. Skript - Backup - rotierend - Ansatz ?

    Skript - Backup - rotierend - Ansatz ?: Wer kann mir einen Ansatz geben für ein Backup-Script das rotiert. Ich erzeuge Datenbankexporte, die ich in ein Verzeichnis ablege dort wird...
  5. Skript für rotierende Backups (z.B. mit rsync) cygwin!

    Skript für rotierende Backups (z.B. mit rsync) cygwin!: ich suche ein einfaches skript für per cron (cygwin) angestoßene rotierende backups meines webservers, konkreter: * backup via ssh (verbindung...