Frage

Ich möchte einen Cron-Job einrichten, um ein Remote-System mit einer Backup-Partition zu rsynchronisieren, etwa so:

bash -c 'rsync -avz --delete --exclude=proc --exclude=sys root@remote1:/ /mnt/remote1/'

Ich würde es gerne „einstellen und vergessen“ können, aber was wäre, wenn? /mnt/remote1 wird unmontiert?(Nach einem Neustart oder so) Ich würde gerne einen Fehler beheben, wenn /mnt/remote1 wird nicht gemountet, anstatt das lokale Dateisystem zu füllen.

Bearbeiten:
Hier ist, was ich mir für ein Skript ausgedacht habe. Ich freue mich über Verbesserungen bei der Bereinigung (besonders für das leere dann ...andernfalls konnte ich sie nicht leer lassen oder Fehler melden)

#!/bin/bash

DATA=data
ERROR="0"

if cut -d' ' -f2 /proc/mounts | grep -q "^/mnt/$1\$"; then
    ERROR=0
else
    if mount /dev/vg/$1 /mnt/$1; then
        ERROR=0
    else
        ERROR=$?
        echo "Can't backup $1, /mnt/$1 could not be mounted: $ERROR"
    fi
fi

if [ "$ERROR" = "0" ]; then
    if cut -d' ' -f2 /proc/mounts | grep -q "^/mnt/$1/$DATA\$"; then
        ERROR=0
    else
        if mount /dev/vg/$1$DATA /mnt/$1/data; then
            ERROR=0
        else
            ERROR=$?
            echo "Can't backup $1, /mnt/$1/data could not be mounted."
        fi
    fi
fi

if [ "$ERROR" = "0" ]; then
    rsync -aqz --delete --numeric-ids --exclude=proc --exclude=sys \
        root@$1.domain:/ /mnt/$1/
    RETVAL=$?
    echo "Backup of $1 completed, return value of rsync: $RETVAL"
fi
War es hilfreich?

Lösung

if cut -d' ' -f2 /proc/mounts | grep '^/mnt/remote1$' >/dev/null; then
    rsync -avz ...
fi

Holen Sie sich die Liste der gemounteten Partitionen von /proc/mounts, nur Übereinstimmung /mnt/remote1 (Und wenn es gemountet ist, senden Sie die Ausgabe von grep an /dev/null), dann führen Sie Ihre aus rsync Arbeit.

Jüngste greps haben eine -q Option, die Sie verwenden können, anstatt die Ausgabe an zu senden /dev/null.

Andere Tipps

mountpoint scheint hier die beste Lösung zu sein:es gibt 0 zurück, wenn ein Pfad ein Einhängepunkt ist:

#!/bin/bash
if [[ `mountpoint -q /path` ]]; then
    echo "filesystem mounted"
else
    echo "filesystem not mounted"
fi

Gefunden am LinuxFragen.

Eine kurze Google-Suche führte mich zu diesem Bash-Skript, das prüfen kann, ob ein Dateisystem gemountet ist.Es scheint, dass das Auslesen der Ausgabe von df oder mount der richtige Weg ist:

if df |grep -q '/mnt/mountpoint$'
    then
        echo "Found mount point, running task"
        # Do some stuff
    else
        echo "Aborted because the disk is not mounted"
        # Do some error correcting stuff
        exit -1
fi
  1. Kopieren Sie das folgende Skript und fügen Sie es in eine Datei ein (z. B.backup.sh).
  2. Machen Sie das Skript ausführbar (z. B. chmod +x backup.sh)
  3. Rufen Sie das Skript als Root mit dem Format auf backup.sh [username (for rsync)] [backup source device] [backup source location] [backup target device] [backup target location]

!!!AUFMERKSAMKEIT!!!Führen Sie das Skript nicht als Root-Benutzer aus, ohne den Code zu verstehen!

Ich denke, es gibt nichts zu erklären.Der Code ist unkompliziert und gut dokumentiert.

#!/bin/bash

##
## COMMAND USAGE: backup.sh [username] [backup source device] [backup source location] [backup target device] [backup target location]
##
## for example: sudo /home/manu/bin/backup.sh "manu" "/media/disk1" "/media/disk1/." "/media/disk2" "/media/disk2"
##

##
## VARIABLES
##

# execute as user
USER="$1"

# Set source location
BACKUP_SOURCE_DEV="$2"
BACKUP_SOURCE="$3"

# Set target location
BACKUP_TARGET_DEV="$4"
BACKUP_TARGET="$5"

# Log file
LOG_FILE="/var/log/backup_script.log"

##
## SCRIPT
##

function end() {
    echo -e "###########################################################################\
#########################################################################\n\n" >> "$LOG_FILE"
    exit $1
}

# Check that the log file exists
if [ ! -e "$LOG_FILE" ]; then
        touch "$LOG_FILE"
    chown $USER "$LOG_FILE"
fi

# Check if backup source device is mounted
if ! mountpoint "$BACKUP_SOURCE_DEV"; then
        echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Backup source device is not mounted!" >> "$LOG_FILE"
    end 1
fi

# Check that source dir exists and is readable.
if [ ! -r  "$BACKUP_SOURCE" ]; then
        echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to read source dir." >> "$LOG_FILE"
        echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to sync." >> "$LOG_FILE"
    end 1
fi

# Check that target dir exists and is writable.
if [ ! -w  "$BACKUP_TARGET" ]; then
        echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to write to target dir." >> "$LOG_FILE"
        echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to sync." >> "$LOG_FILE"
    end 1
fi

# Check if the drive is mounted
if ! mountpoint "$BACKUP_TARGET_DEV"; then
        echo "$(date "+%Y-%m-%d %k:%M:%S") - WARNING: Backup device needs mounting!" >> "$LOG_FILE"

        # If not, mount the drive
        if mount "$BACKUP_TARGET_DEV" > /dev/null 2>&1 || /bin/false; then
                echo "$(date "+%Y-%m-%d %k:%M:%S") - Backup device mounted." >> "$LOG_FILE"
        else
                echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to mount backup device." >> "$LOG_FILE"
                echo "$(date "+%Y-%m-%d %k:%M:%S") - ERROR: Unable to sync." >> "$LOG_FILE"
        end 1
        fi
fi

# Start entry in the log
echo "$(date "+%Y-%m-%d %k:%M:%S") - Sync started." >> "$LOG_FILE"

# Start sync
su -c "rsync -ayhEAX --progress --delete-after --inplace --compress-level=0 --log-file=\"$LOG_FILE\" \"$BACKUP_SOURCE\" \"$BACKUP_TARGET\"" $USER
echo "" >> "$LOG_FILE"

# Unmount the drive so it does not accidentally get damaged or wiped
if umount "$BACKUP_TARGET_DEV" > /dev/null 2>&1 || /bin/false; then
    echo "$(date "+%Y-%m-%d %k:%M:%S") - Backup device unmounted." >> "$LOG_FILE"
else
    echo "$(date "+%Y-%m-%d %k:%M:%S") - WARNING: Backup device could not be unmounted." >> "$LOG_FILE"
fi

# Exit successfully
end 0

Ich überfliege dies, aber ich denke, Sie würden lieber rsync -e ssh verwenden und die Schlüssel einrichten, um das Konto zu akzeptieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top