Я хочу настроить задание 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





Быстрый поиск в 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Вопросы.
Я просматриваю это, но я думаю, вы бы предпочли rsync -e ssh и настроить ключи для принятия учетной записи.
chmod +x backup.sh)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
за исключением того, что лучше использовать
! mountpoint -q /dest || rsync -a /source/ /dest