RSync nur, wenn das Dateisystem gemountet ist
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
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 grep
s 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
- Kopieren Sie das folgende Skript und fügen Sie es in eine Datei ein (z. B.backup.sh).
- Machen Sie das Skript ausführbar (z. B.
chmod +x backup.sh
) - 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.