जब तक फ़ाइलों को सफलतापूर्वक स्थानांतरित नहीं किया जाता है तब तक rsync को बार-बार कैसे कॉल करें


27

मैं एक दूरस्थ सर्वर से फ़ाइलों को सिंक्रनाइज़ करने की कोशिश कर रहा हूं जो विश्वसनीय नहीं है, जिसका अर्थ है कि कनेक्शन "बेतरतीब ढंग से" विफल हो जाता है

rsync: कनेक्शन अनपेक्षित रूप से बंद हो गया

Rsync --partial के साथ कहा जाता है, इसलिए मैं एक लूप में rsync कॉल करने में सक्षम होना चाहता हूं जब तक कि फ़ाइलों को पूरी तरह से स्थानांतरित नहीं किया जाता है। Rsync को फिर से बताने के लिए एक ध्वज प्रतीत नहीं होता है।

इसे स्क्रिप्ट करने का सबसे अच्छा तरीका क्या होगा? पाश के लिए एक बकवास?


1
हालांकि नीचे दिए गए उत्तर सहायक हैं, यह पता लगाना बेहतर हो सकता है कि यह क्यों विफल हो रहा है और इसे रोकना है। मुझे लगता है कि आप सर्वर, क्लाइंट और नेटवर्क को बीच में नियंत्रित करते हैं, इसलिए आप विभिन्न स्थानों पर tcpdump चला सकते हैं यह देखने के लिए कि यह कैसे बंद हुआ। शायद आपका कोई फ़ायरवॉल या वीपीएन डिवाइस कनेक्शन बंद कर रहा है?
मार्क

सर्वर जो इसे कनेक्ट कर रहा है वह एक साझा होस्ट है, इसलिए मेरे पास इसकी रूट एक्सेस नहीं है। मैं इस बात पर गौर कर सकता हूं कि यह क्यों बंद हो रहा है, लेकिन अभी के लिए मैं खुश हूं बस इसे फिर से करना है। वैसे भी सिर के लिए धन्यवाद
ब्रूनो लोप्स

मैं हैरान था कि rsync की खोज वास्तव में पुन: प्रयास करने की क्षमता नहीं थी!
माइकल

rsync --partial --append में रिट्रीव, मैन्युअल रूप से या स्क्रिप्ट में रिटर्न कोड की जाँच करने की क्षमता होती है। : का डुप्लीकेट superuser.com/questions/302842/...
rickfoosusa

जवाबों:


29

यदि आप सब कुछ एक सिंक में सिंक कर रहे हैं, तो rsync को तब तक लूप में कॉल करें जब तक rsync आपको एक सफल रिटर्न कोड न दे।

कुछ इस तरह:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

यह rsync को कॉल करेगा, जब तक कि यह 0. का रिटर्न कोड नहीं देता। आप अपने सर्वर को डॉसिंग से बनाए रखने के लिए इसमें एक नींद जोड़ना चाहते हैं।


28
आप बस लिख सकते हैं जबकि! rsync -a ...., सोते हुए 5; किया
जस्टिन

1
उदाहरण के लिए, यदि आप इसे क्रोन के माध्यम से चलाने की कोशिश करते हैं, तो आप समसामयिक मुद्दों में भाग सकते हैं, इसका उपयोग कैसे करें, सावधान रहें।
कीरान होलोवे

3
यदि कोई गैर-पारगमन त्रुटि है (उदाहरण के लिए अनुमतियाँ पढ़ने या फ़ाइलों को लिखने में) तो यह एक अनंत लूप में बदल जाएगी। मैं विशिष्ट नेटवर्क त्रुटियों के लिए rsync के बाहर निकलने की स्थिति की जाँच करने की सलाह दूंगा, कुछ RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](या जो भी निकास स्थितियाँ आप नेटवर्क ड्रॉप से ​​देख रहे हैं)।
गॉर्डन डेविसन 23

1
जैसा कि मैं इसे (पूरी तरह से) अनअटेंडेड नहीं चला रहा हूं, अनंत लूप्स और कॉन्सिक्वेंसी बहुत ज्यादा इश्यू नहीं हैं, धन्यवाद।
ब्रूनो लोप्स

2
यह शर्म की बात है कि इस सुविधा में बिल्ट नहीं है, क्योंकि किसी भी प्रकार का शेल आधारित लूप उन मामलों में पासवर्ड के लिए संकेत देगा जहां स्वत: प्रमाणीकरण उपलब्ध नहीं है या उपयुक्त नहीं है।
माइकल

11

मैं थोड़ी देर पहले इसी समस्या में भाग गया। अंत में मैंने डेविड के उत्तर के समान कुछ लिखा, लेकिन अधिकतम रिट्रीट के साथ इसे थोड़ा ऊपर उठाया, Ctrl-C का जवाब दिया, और इस तरह: http://blog.iangreenleaf.com/2009/03/rsync-and-retrying- जब तक-हम-यह-यहhtml


1

यह सब एक साथ sshpass purtting

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.