टूटे कनेक्शन के बाद SSH पर फिर से शुरू करें?


45

मुझे rsync का उपयोग करके बड़ी मात्रा में डेटा (> 80 जीबी) ट्रांसफर करना है। सबकुछ ठीक काम कर रहा है, लेकिन डीएसएल कनेक्शन जहां से बैकअप डेटा भेजा जाता है, हर 24 घंटों में एक बार 3 मिनट तक चलेगा (प्रदाताओं को स्विच करना एक विकल्प नहीं है)।

मैं कैसे:

  1. कनेक्शन वापस आने पर स्वचालित रूप से स्थानांतरण को पुनः आरंभ करें?

  2. सुनिश्चित करें कि वहाँ दुर्घटना दो rsync आदेश एक ही समय में नहीं चल रहे हैं?


क्या आप रिटर्न कोड की जांच नहीं कर सकते? while ./run_script; do echo "Retrying..."; done; echo "Done."सुनिश्चित करें कि run_scriptरिटर्न 0सफलता पर।
केरेक एस.बी.

के संभावित डुप्लिकेट serverfault.com/q/98745
तानीस

यहाँ कुछ उपयोगी जानकारी - मैं केवल यह जोड़ना चाहता हूं कि पासवर्ड की समस्या के लिए बार-बार पूछने के लिए एक तरीका यह है कि आप 'sshpass' कमांड का उपयोग करें। आमतौर पर इसे एप्ट-
राचेल सॉन्डर्स

जवाबों:


52

निम्नलिखित सहायक होना चाहिए:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

जब कनेक्शन मर जाता है, तो rsync एक गैर-शून्य निकास कोड के साथ छोड़ देगा। यह स्क्रिप्ट बस rsync को चालू रखती है, इसे तब तक जारी रखने देती है जब तक कि सिंक्रनाइज़ेशन सामान्य रूप से पूरा नहीं हो जाता।


1
धन्यवाद, मैं अब यह कोशिश कर रहा हूँ ... लेकिन यह होना चाहिए: अगर ["$?" = "0"] नहीं: यदि ["$?" == "0"] (तुलना ऑपरेटर)?

1
नहीं, बाश में "=" स्ट्रिंग समानता है (कई चीजों में से एक है जो इसे भ्रमित करती है, मुझे लगता है!)
पीटर

6
== के लिए उपनाम है =: D
bbaja42

8
आह, जानकर अच्छा लगा। बैश कभी भी मुझे विस्मित / भयभीत नहीं करेगा: -पी
पीटर

2
पार्टी के लिए देर से, हालांकि बाद के लिए: ए) बस का उपयोग करें: अगर rsync -avz --partial स्रोत गंतव्य; तब ... बी) यदि आप अभिन्न मान की तुलना करना चाहते हैं यदि अंकगणितीय विस्तार के लिए डबल कोष्ठक का उपयोग करें: यदि (($? = 0)) तो;
user18402

7

यह पीटर के उत्तर के समान ही है, लेकिन उपयोगकर्ता को वह रिमोट फ़ाइल का विकल्प देता है जिसे वह चाहता है, और जहां वह इसे सहेजना चाहता है (साथ ही ssh पर rsync का संचालन भी करता है)। अपने उपयोगकर्ता नाम और होस्ट के साथ क्रमशः USER और HOST बदलें।

#! / Bin / bash
echo -e "कृपया पूर्ण दर्ज करें (बच गया) फ़ाइल पथ:"
पढ़ें -r पथ
गूंज "पथ: $ पथ"
इको-ई "गंतव्य दर्ज करें:"
read -r dst
गूंज "गंतव्य: $ dst"
जबकि [1]
करना
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ पाथ" $ dst
    अगर ["$?" = "0"]; फिर
        गूंज "rsync सामान्य रूप से पूरा"
        बाहर जाएं
    अन्य
        इको "rsync विफलता। एक मिनट में पुन: प्रयास कर रहा है ..."
        60 सो जाओ
    फाई
किया हुआ

यहां उपयोग किए गए rsync विकल्प स्थानांतरण के दौरान प्रगति के आँकड़ों को सक्षम करते हैं, अप्रत्याशित विफलता पर आंशिक फ़ाइलों की बचत और फिर से शुरू होने पर आंशिक रूप से पूर्ण फ़ाइलों को जोड़ने की क्षमता रखते हैं। -V विकल्प वर्बोसिटी बढ़ाता है, -z विकल्प संपीड़न (एक धीमी गति से कनेक्शन के लिए अच्छा है, लेकिन दोनों छोरों पर अधिक सीपीयू शक्ति की आवश्यकता होती है), और -e विकल्प हमें ssh पर इस हस्तांतरण का संचालन करने में सक्षम बनाता है (एन्क्रिप्शन हमेशा अच्छा होता है)।

नोट: इसका उपयोग केवल तभी करें जब आपके पास सार्वजनिक कुंजी लॉगिन आपके ssh के साथ सक्षम हो, अन्यथा यह पुनरारंभ होने पर आपको पासवर्ड के लिए पूछेगा (स्क्रिप्ट की सभी कार्यक्षमता को मारना)।


1
यह मूल प्रश्न का सबसे अच्छा उत्तर है। यह गलत उत्तर के साथ एक डुप्लिकेट पर भी लागू होता है: serverfault.com/questions/98745/…
rickfoosusa

5

पर्यवेक्षक डेमॉन (एक प्रक्रिया नियंत्रण प्रबंधक) दोनों पक्षों के आरएएस प्रमाण पत्र बनाने के बाद बहुत अच्छी तरह से काम कर सकता है, निम्न विन्यास के साथ एक समान है: (/ etc / पर्यवेक्षक / पर्यवेक्षक.conf debian आधारित सिस्टम पर कॉन्फ़िगरेशन फ़ाइल पथ है)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

@ पीटर का उत्तर बहुत उपयोगी लगता है, लेकिन मेरे लिए --updateविकल्प का उपयोग करना महत्वपूर्ण था । कनेक्शन फिर से शुरू हो जाने के बाद, बिना --updatersync बहुत भीख मांगने से सभी को सिंक करने की कोशिश कर रहा था। इसके साथ --update, पहले से मौजूद फाइलें छोड़ दी जाती हैं।

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--updateफ़ाइलें जो पहले से मौजूद हैं, उनमें शामिल हैं ... उन सभी को शामिल करना जो पूरी तरह से लक्ष्य पर कॉपी नहीं किए गए हैं। मुझे लगता है कि यह ज्यादातर उपयोग के मामलों के खिलाफ जाता है।
ड्यूरम

@ डरम कम से कम rsync 3.1.2 पर सच नहीं है। अंतरण बाधित होने के बाद मैं देखता हूं कि यह एक ही फाइल पर ठीक से काम करता है। मैंने ss पर rsync का उपयोग किया, कमांड थी rsync --partial --update file1 remotehost:file1। 15% स्थानांतरित करने के बाद मैंने ट्रांसफर (किल -किल) को तोड़ दिया।
फिलीप्रेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.