Сведения о вопросе

HEIGTH

23:59, 17th August, 2020

Теги

bash   backup   sysadmin   rsync    

RSync только если смонтирована файловая система

Просмотров: 404   Ответов: 5

Я хочу настроить задание cron для rsync удаленной системы на резервный раздел, Что-то вроде:

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

Я хотел бы иметь возможность "set it and forget it", но что делать, если /mnt/remote1 будет размонтирован? (После перезагрузки или чего-то еще) я хотел бы ошибиться, если /mnt/remote1 не смонтирован, а не заполнять локальную файловую систему.

Редактировать:
Вот что я придумал для скрипта, очистку улучшений оценил (особенно для пустого тогда ... иначе я не мог бы оставить их пустыми или 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



  Сведения об ответе

SSESION

05:58, 2nd August, 2020

mountpoint , по-видимому, является лучшим решением для этого: он возвращает 0, если путь является точкой mount:

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

Найдено на LinuxQuestions .


  Сведения об ответе

davran

19:34, 26th August, 2020

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

Получите список смонтированных разделов из /proc/mounts, только совпадите с /mnt/remote1 (и если он смонтирован, отправьте вывод grep в /dev/null), а затем запустите задание rsync .

Последние grep s имеют параметр -q , который можно использовать вместо отправки выходных данных в /dev/null .


  Сведения об ответе

DO__IT

20:20, 28th August, 2020

Быстрый google привел меня к этому скрипту bash, который может проверить, смонтирована ли файловая система. Похоже, что применение grep к выходу ДФ или mount путь:

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


  Сведения об ответе

SKY

16:46, 18th August, 2020

  1. Скопируйте и вставьте приведенный ниже скрипт в файл (например, backup.sh).
  2. Сделайте скрипт исполняемым (например, chmod +x backup.sh )
  3. Вызовите скрипт как root с форматом backup.sh [username (for rsync)] [backup source device] [backup source location] [backup target device] [backup target location] !!
!

ATTENTION!!! Не выполнить скрипт с правами root пользователя без понимания кода!

Я думаю, тут нечего объяснять. Код прост и хорошо документирован.

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


  Сведения об ответе

dump

16:31, 10th August, 2020

Я просматриваю это, но я думаю, что вы предпочтете rsync-e ssh и настроите ключи, чтобы принять учетную запись.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться