2008-08-26 12 views
8

मैं सेटअप करना चाहते हैं एक क्रॉन जॉब लगाया गया है एक बैकअप विभाजन के लिए एक दूरस्थ प्रणाली rsync के लिए, की तरह कुछ:rsync ही अगर फाइल सिस्टम

bash -c 'rsync -avz --delete --exclude=proc --exclude=sys [email protected]:/ /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 \ 
     [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 से मेल खाते हैं (और अगर यह लगाया गया है, /dev/null को ग्रेप के उत्पादन भेज), फिर अपना rsync नौकरी चलाएं।

हालिया grep के पास -q विकल्प है जिसका उपयोग आप /dev/null पर आउटपुट भेजने के बजाय उपयोग कर सकते हैं।

3

एक त्वरित Google ने मुझे इस बैश स्क्रिप्ट पर ले जाया जो जांच सकता है कि कोई फ़ाइल सिस्टम आरोहित है या नहीं। ऐसा लगता है कि df या पर्वत के उत्पादन grepping जाने का रास्ता है:

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

+1

सिवाय इसके कि इसका उपयोग करना बेहतर है! माउंटपॉइंट -क/dest || rsync -a/स्रोत// dest' – Nacht

0

मैं इसे स्किम कर रहा हूं लेकिन मुझे लगता है कि आप rsync -e ssh और खाते को स्वीकार करने के लिए कुंजी सेट अप करेंगे।

1
  1. स्क्रिप्ट को नीचे फ़ाइल में कॉपी और पेस्ट करें (उदा। बैकअप.एस)।
  2. स्क्रिप्ट निष्पादन योग्य (जैसे chmod +x backup.sh)
  3. कॉल प्रारूप 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 
संबंधित मुद्दे