sincronizar respaldos remoto orden incremental encontró eliminar ejemplos con archivos bash backup sysadmin rsync

bash - respaldos - RSync solo si el sistema de archivos está montado



rsync windows (5)

Un google rápido me llevó a este script bash que puede verificar si un sistema de archivos está montado. Parece que almacenar la salida de df o mount es el camino a seguir:

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

Quiero configurar un trabajo cron para sincronizar un sistema remoto con una partición de respaldo, algo como:

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

Me gustaría poder "configurarlo y olvidarlo", pero ¿qué pasa si /mnt/remote1 se desmonta? (Después de reiniciar o algo así) me gustaría un error de salida si /mnt/remote1 no está montado, en lugar de llenar el sistema de archivos local.

Editar:
Esto es lo que se me ocurrió para un guión, se apreciaron mejoras en la limpieza (especialmente para el vacío, entonces ... de lo contrario, no podía dejarlos vacíos o errores de bash)

#!/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


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

Obtenga la lista de particiones montadas de /proc/mounts , solo match /mnt/remote1 (y si está montada, envíe la salida de grep a /dev/null ), luego ejecute su trabajo rsync .

Los grep recientes tienen una opción -q que puede usar en lugar de enviar la salida a /dev/null .


mountpoint parece ser la mejor solución para esto: devuelve 0 si una ruta es un punto de montaje:

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

Encontrado en LinuxQuestions .


Estoy rozando Esto, pero creo que preferiría rsync -e ssh y configurar las claves para aceptar la cuenta.


  1. Copie y pegue el script a continuación en un archivo (por ejemplo, backup.sh).
  2. Hacer que el script sea ejecutable (ej chmod +x backup.sh )
  3. Llame al script como root con el formato backup.sh [username (for rsync)] [backup source device] [backup source location] [backup target device] [backup target location]

!!!¡¡¡ATENCIÓN!!! ¡No ejecute el script como usuario root sin entender el código!

Creo que no hay nada que explicar El código es sencillo y está bien documentado.

#!/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