RSync فقط إذا تم تركيب نظام الملفات
سؤال
أرغب في إعداد مهمة cron لمزامنة نظام بعيد مع قسم النسخ الاحتياطي، مثل:
bash -c 'rsync -avz --delete --exclude=proc --exclude=sys root@remote1:/ /mnt/remote1/'
أود أن أكون قادرًا على "ضبطه ونسيانه" ولكن ماذا لو /mnt/remote1
يصبح غير مثبتة؟(بعد إعادة التشغيل أو شيء من هذا القبيل) أود أن أخطأ إذا /mnt/remote1
لم يتم تركيبه، بدلاً من ملء نظام الملفات المحلي.
يحرر:
هذا ما توصلت إليه بالنسبة للبرنامج النصي، مع تقدير تحسينات التنظيف (خاصة بالنسبة للأجزاء الفارغة آنذاك ...بخلاف ذلك، لم أتمكن من تركها فارغة أو أخطاء باش)
#!/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
احصل على قائمة الأقسام المثبتة من /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
وجدت في أسئلة لينكس.
قادني بحث سريع عبر Google إلى برنامج bash النصي هذا الذي يمكنه التحقق من تثبيت نظام الملفات.يبدو أن الاستيلاء على إخراج 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
- انسخ والصق البرنامج النصي أدناه في ملف (على سبيل المثال.Backup.sh).
- اجعل البرنامج النصي قابلاً للتنفيذ (على سبيل المثال.
chmod +x backup.sh
) - استدعاء البرنامج النصي كجذر بالتنسيق
backup.sh [username (for rsync)] [backup source device] [backup source location] [backup target device] [backup target location]
!!!انتباه!!!لا تقم بتنفيذ البرنامج النصي كمستخدم جذري دون فهم الكود!
أعتقد أنه لا يوجد شيء يمكن تفسيره.الكود واضح وموثق جيدًا.
#!/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
أنا أتصفح هذا ولكني أعتقد أنك تفضل rsync -e ssh وإعداد المفاتيح لقبول الحساب.