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

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

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

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

Редактировать:
Вот что я придумал для сценария, улучшения очистки были оценены (особенно для пустых then ... иначе я не мог оставить их пустыми или ошибками bash)

#!/bin/bash

DATA=data
ERROR = "0"

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

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

if [ "$ERROR" = "0" ]; then
    rsync -aqz --delete --numeric-ids --exclude=proc --exclude=sys \
        [email protected]:/ /mnt//
    RETVAL=$?
    echo "Backup of  completed, return value of rsync: $RETVAL"
fi
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
7 198
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Быстрый поиск в Google привел меня к этому сценарию bash, который может проверить, смонтирована ли файловая система. Кажется, что grepping вывода df или 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
Ответ принят как подходящий

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

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

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

mountpoint кажется лучшим решением этой проблемы: он возвращает 0, если путь является точкой монтирования:

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

Найдено по адресу LinuxВопросы.

за исключением того, что лучше использовать ! mountpoint -q /dest || rsync -a /source/ /dest

Nacht 25.02.2015 15:04

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

  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].

!!!ВНИМАНИЕ!!! Не выполняйте сценарий от имени пользователя 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 = ""

# Set source location
BACKUP_SOURCE_DEV = ""
BACKUP_SOURCE = ""

# Set target location
BACKUP_TARGET_DEV = ""
BACKUP_TARGET = ""

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

##
## SCRIPT
##

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

# 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

Другие вопросы по теме