2008-08-26 2 views
8

Я хочу настроить хроны работой в RSync удаленной системы в раздел резервного копирования, что-то вроде:RSync только если файловая система смонтирована

bash -c 'rsync -avz --delete --exclude=proc --exclude=sys [email protected]:/ /mnt/remote1/' 

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

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

#!/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 \ 
     [email protected]$1.domain:/ /mnt/$1/ 
    RETVAL=$? 
    echo "Backup of $1 completed, return value of rsync: $RETVAL" 
fi 

ответ

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

3

Быстрый google привел меня к этому сценарию bash, который может проверить, установлена ​​ли файловая система. Кажется, что оглавлению выход ФР или монтировки является путь:

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 
4

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

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

Найдено в LinuxQuestions.

+0

лучший ответ прямо здесь. – Nacht 2015-02-25 09:31:24

0

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

1
  1. Скопируйте и вставьте сценарий ниже в файл (например, backup.sh).
  2. сделать скрипт исполняемым (например chmod +x backup.sh)
  3. Вызовите сценарий как корень с форматом 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="$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 
Смежные вопросы