rsync निश्चित रूप से इस काम के लिए सही उपकरण है। यह निर्देशिकाओं को सिंक्र में रखने के लिए मौजूद है और इसे बहुत हद तक स्मार्ट के साथ कर सकता है। उदाहरण के लिए: यह केवल डेल्टास को स्थानांतरित कर देगा जब भी यह कर सकता है और यह ssh सुरंगों पर काम कर सकता है।
मान लें कि आपके पास मशीन स्रोत है जो निर्देशिका ट्री /my/tree
और मशीन सिंक के आपके लाइव संस्करण को होस्ट करता है जिसे आप इसके साथ निकटता में रखना चाहते हैं। यदि आपके पास सिंक पर एक ssh खाता है , तो आप स्रोत का उपयोग rsync से निम्नानुसार कर सकते हैं:
rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree
यह मानता है कि आप सिंक/my/tree
पर ठीक उसी स्थान पर चाहते हैं जैसा कि आपके पास स्रोत पर है । बेशक, आपको इसे उसी स्थान पर रखने की आवश्यकता नहीं है।
कमांड लाइन को तोड़ना:
-avz
: संग्रह मोड, क्रिया से बाहर, स्थानांतरण के दौरान संपीड़न का उपयोग करें
--delete
: सिंक पर मौजूद फ़ाइलें हटाएं जो स्रोत पर मौजूद नहीं हैं
-e ssh
: कनेक्शन विधि के रूप में ssh का उपयोग करें
यह कॉल, निश्चित रूप से आपसे पासवर्ड मांगेगी जब आप इसे बनाते हैं। यदि आप कुछ स्वचालित फैशन में ऐसा करना चाहते हैं, तो आपको मशीनों पर खातों के बीच कुछ कुंजियों को साझा करने और ssh कनेक्शन बनाने के लिए सार्वजनिक-निजी कुंजी एन्क्रिप्शन का उपयोग करने की आवश्यकता होगी।
इस rysnc के लिए अपनी मुख्य जोड़ी सेट करने के लिए, अपने सोर्स मशीन पर निम्न कमांड चलाएँ :
> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in ~/.ssh/my-rsync-key.
Your public key has been saved in ~/.ssh/my-rsync-key.pub.
The key fingerprint is:
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source
> chmod 600 ~/.ssh/my-rsync-key
काम करने के लिए इस कुंजी युग्म के लिए हम की सामग्री को जोड़ने की जरूरत है ~/.ssh/my-rsync-key.pub
करने के लिए ~<remoteuser>/.ssh/authorized_keys
पर फ़ाइल सिंक मशीन।
पहले फाइल को सिंक मशीन पर कॉपी करें :
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
फिर सिंक मशीन पर जाएं और मशीन पर रिमोटस के रूप में निम्नलिखित को चलाकर कुंजी आयात करें :
> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub
आपके स्रोत और सिंक मशीनों के बीच ssh कनेक्शन को लॉक करने के अतिरिक्त सुझावों के लिए मैं इस पृष्ठ पर एक नज़र डालने की सलाह देता हूं ।
अपने स्रोत मशीन से आप परीक्षण कर सकते हैं कि यह सेटअप चल रहा है:
rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree
यह एक rsync का सूखा भाग करेगा। यदि आप rsync कमांड को देख रहे हैं और उन फाइलों की तुलना कर रहे हैं जिन्हें आप जानते हैं कि चीजें ठीक से सेटअप हैं।
अब हमें लॉन्चड कॉन्फिग फाइल से इस rsync कमांड को कॉल करने का एक आसान तरीका चाहिए, जैसा कि इस साइट पर इस उपयोगी उत्तर में दिखाया गया है । जब से आप चाहते हैं कि यह कॉल एक तंग लूप में हो, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपके पास एक ही समय में rsync की कई प्रतियां नहीं चल रही हैं। आप एक म्यूटेक्स बनाने के लिए झुंड का उपयोग कर सकते हैं जो सुनिश्चित करता है कि बैश स्क्रिप्ट सिंगलटन है: इसका केवल एक उदाहरण प्रत्येक मशीन पर एक बार में चलता है। इसलिए हम डिस्क पर निम्नलिखित स्क्रिप्ट बनाने जा रहे हैं:
#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree
exec 9>${LOCK}
if ! flock -n 9 ; then
echo "Another instance of your rsync is already running";
exit 1
fi
echo "----------" >> ${LOG}
echo `date` >> ${LOG}
rsync -avz --delete -e "ssh -i ${KEY}" \
${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}
उस के रूप में सहेजें ~/my_rsync.sh
।
वह स्क्रिप्ट आपके लिए rsync करने का ध्यान रखेगी। अब आपको केवल लॉन्चड के माध्यम से इसे सेट करने की आवश्यकता है और इसे एक तंग लूप में चलाना है। यहां से निर्देशों का पालन करते हुए और इसे अपनी आवश्यकताओं को पूरा करने के लिए संशोधित करते हुए, हम ~/Library/LaunchAgents/my-rsync.plist
एक टेक्स्ट एडिटर में बनाने जा रहे हैं और सामग्री बनाते हैं:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>My Rsync</string>
<key>Program</key>
<string>/bin/sh</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
</array>
<key>ServiceDescription</key>
<string>Keep /my/tree synchronized with the machine sink</string>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
कि चीजों का ध्यान रखना चाहिए।
सामान्य चेतावनी लागू होती है: मैंने इसे स्मृति से लिखा था और इसका परीक्षण नहीं किया था। तो आँख बंद करके पालन न करें। रास्ते में सावधानी से परीक्षण करें। जब भी आपको संदेह हो आप --dry-run
rsync पर विकल्प का उपयोग करें । यह पता लगाएगा कि वास्तव में कुछ किए बिना उसने क्या किया होगा ।