मैं एक स्क्रिप्ट लिखूंगा जो यह जांच करे कि क्या बैकअप 1,7 या 30 दिन से अधिक पुराना है और तदनुसार कार्य करता है। आपने ऐसा नहीं कहा है, लेकिन मुझे लगता है कि आप लिनक्स का उपयोग कर रहे हैं (मैंने आपके सवाल में लिनक्स टैग जोड़ा है ) और आप एक दूरस्थ सर्वर का समर्थन कर रहे हैं। पहला कदम यह होगा कि थोड़ी स्क्रिप्ट लिखी जाए जो आपकी rsyncकमांड को चलाए और बैकअप खत्म होने पर रिमोट सर्वर पर एक फाइल भी बनाए । इसका उपयोग दोनों को यह बताने के लिए किया जाएगा कि क्या कोई बैकअप वर्तमान में चल रहा है और बैकअप की आयु की जांच करने के लिए (मेरा मानना है कि जब आप फ़ाइलों का बैकअप लेते हैं तो आप मूल टाइमस्टैम्प रख रहे हैं, इसलिए आप फ़ाइलों से स्वयं दिनांक प्राप्त नहीं कर सकते):
रुपी स्क्रिप्ट (यह मानता है कि आपके पास दूरस्थ सर्वर तक पासवर्ड-कम पहुंच है):
#!/usr/bin/env bash
ssh user@remote rm /path/to/daily/backup/backup_finished.txt
rsync /path/to/source/ user@remote:/path/to/daily/backup/
ssh user@remote touch /path/to/daily/backup/backup_finished.txt
पर स्थानीय मशीन, एक की स्थापना की क्रॉन जॉब कि दैनिक बैकअप करता है:
@daily rsync_script.sh
पर दूरस्थ मशीन, आप स्क्रिप्ट मैं हर कुछ घंटों के नीचे दे चलाने की आवश्यकता:
@hourly check_backup.sh
Check_backup.sh स्क्रिप्ट:
#!/usr/bin/env bash
daily=/path/to/daily;
weekly=/path/to/weekly;
monthly=/path/to/monthly;
## The dates will be measured in seconds since the UNIX epoch,
## so we need to translate weeks and months (31 days) to seconds.
week=$((60*60*24*7));
month=$((60*60*24*31));
## Make sure no backup is currently running
if [ ! -e $daily/backup_finished.txt ]; then
echo "A backup seems to be running, exiting." && exit;
fi
## Get the necessary dates
weekly_backup_date=$(stat -c %Y $weekly/backup_finished.txt)
monthly_backup_date=$(stat -c %Y $monthly/backup_finished.txt)
now=$(date +%s)
monthly_backup_age=$((now - monthly_backup_date))
weekly_backup_age=$((now - weekly_backup_date))
## Check the age of the daily backup and copy it accordingly
if [[ "$monthly_backup_age" -gt "$month" ]]; then
## Copy unless the current $daily is identical to $weekly
diff $daily $weekly > /dev/null ||
## Delete the previous backup and copy the new one over
rm -rf $monthly && cp -rp $daily $monthly
fi
## Copy the weekly backup if it is older than a week but only
## if it is not identical to $monthly. The -r flag makes cp
## recursive and the -p flag makes it preserve dates and permissions.
if [[ "$weekly_backup_age" -gt "$week" ]]; then
## Copy unless the current $daily is identical to $monthly
diff $daily $monthly > /dev/null ||
rm -rf $weekly && cp -rp $daily $weekly
fi
तो, यह स्क्रिप्ट ( check_backup.sh) आपके बैकअप सर्वर पर हर घंटे चलाई जाएगी। चूँकि यह तब तक कुछ नहीं करता जब तक कि बैकअप पर्याप्त पुराना न हो, इसलिए इसे इतनी बार चलाने की कोई समस्या नहीं है। अब, हर बार एक दैनिक बैकअप 31 दिनों से अधिक पुराना है, इसे monthlyनिर्देशिका में कॉपी किया जाएगा और monthlyविल की सामग्री हटा दी जाएगी। इसी तरह साप्ताहिक के लिए जब बैकअप 7 दिन से अधिक पुराना हो।
मैं diffबैकअप की तुलना करने के लिए उपयोग कर रहा हूं । इसका मतलब यह है कि हम में कॉपी कर देंगे dailyकरने के लिए weeklyकरता है, तो वर्तमान weeklyएक सप्ताह से अधिक पुराना है , लेकिन केवल अगर बैकअप कॉपी कर दिए जाएंगे (वर्तमान daily) मौजूदा रूप में ही नहीं है weeklyऔर इसी के लिए monthly। उदाहरण के लिए, यदि स्क्रिप्ट अभी-अभी चली है और उसने देखा है कि मासिक बैकअप वर्तमान साप्ताहिक के समान ही है, तो यह मौजूदा को अधिलेखित नहीं करेगा monthly। हालांकि, एक सप्ताह बाद जब weeklyवसीयत बदल गई है, तब वह monthlyएक की नकल करेगा ।
इसका शुद्ध परिणाम यह है कि किसी भी समय आपके पास न्यूनतम दो अलग-अलग बैकअप होने चाहिए और आमतौर पर आपके पास तीन होंगे। सबसे खराब स्थिति यह है कि कुछ विफल रहता है और आपके पास एक सप्ताह पुराना बैकअप नहीं है, बस एक महीने पुराना है या इसके विपरीत , आपके पास एक महीने पुराना नहीं है, लेकिन आपके पास पिछले सप्ताह का है।