अगर rsync ने bash में कोई बदलाव किया है तो मैं कैसे जांच सकता हूं?


12

मेरे पास एक स्क्रिप्ट है जो दूरस्थ -> स्थानीय परिदृश्य में डेटा को सिंक करने के लिए rsync का उपयोग करती है। Rsync कमांड चलने के तुरंत बाद, यह देखने के लिए एक जांच कि त्रुटि कोड शून्य के बराबर है या नहीं। यदि इसका शून्य है, तो आगे कमांड का प्रदर्शन किया जाता है। यह हालांकि इस तथ्य को ध्यान में नहीं रखता है कि rsync सफलतापूर्वक चला गया हो सकता है लेकिन वास्तव में कोई परिवर्तन नहीं किया गया है। इसकी वजह से समान शून्य स्थिति की परवाह किए बिना चलेगी, जो कि थोड़ा बेमानी है।

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

यह जांचने के लिए कि क्या वास्तव में rsync कमांड के आधार पर कोई बदलाव हुए हैं, इसे विस्तारित करने के लिए सबसे अच्छा तरीका क्या होगा। मैंने पढ़ा है कि -i ध्वज स्टडआउट को आउटपुट प्रदान कर सकता है, लेकिन इसे सशर्त ब्लॉक में कैसे रखा जा सकता है?


आप -vवहां पहुंच गए हैं, इसलिए यह पहले से ही आपको आवश्यक जानकारी प्रदान कर रहा है ... उदाहरण के लिए, फ़ाइलों की एक सूची जो वास्तव में भेजी गई थी। अगर कुछ भी नहीं बदला है, तो बस ./
गोल्डीलॉक्स

आह! क्या होगा यदि मैंने इसके बजाय -v और उपयोग -i लिया और फिर rsync कमांड पर एक गैर-रिक्त स्ट्रिंग जाँच का उपयोग करें?
जेम्स व्हाइट

लगता है कि आपने खुद ही समाधान ढूंढ लिया? :-)
ब्योर्न मंक

2
आप उपयोग कर सकते हैं a=$("rsync command")। इस पर अमल होगा rsyncकमान और दुकान stdoutमें a। फिर आप परीक्षणों को चला सकते हैंa
nitishch

1
आप ऐसा | grep /कुछ भी जोड़ सकते हैं , फिर grep के बाहर निकलने की स्थिति की जाँच करें $?, अगर कोई आउटपुट नहीं था तो यह 1 होना चाहिए।
ब्योर्न मंच

जवाबों:


9

मेरे मूल प्रश्न की टिप्पणियों के आधार पर, -i ध्वज के साथ स्टडआउट करने के लिए rsync आउटपुट करें और यह देखने के लिए कि क्या वास्तव में त्रुटि कोड की जाँच में कुछ भी बदल गया है, यह देखने के लिए एक गैर स्ट्रिंग चेक स्थिति का उपयोग करें। एक चर में rsync कमांड लपेटने से चेक को किया जा सकता है।

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

संभावित नकारात्मक पक्ष, आपको वर्बोज़ आउटपुट खोना होगा, लेकिन आप इसे हमेशा फ़ाइल के बजाय लॉग कर सकते हैं।


1

मैं और अधिक सख्त समाधान चाहता था। मैं Number of created files:(दूसरी भाषा में संदेश हो सकता है) के लिए grep नहीं करना चाहता या सभी लाइनों को हटा सकता हूं लेकिन -vआउटपुट में दो (जो जानता है कि rsyncअगले संस्करण में कौन सा सारांश प्रिंट होगा?)।

मैंने पाया कि आप एक rsync's लॉग का प्रारूप सेट कर सकते हैं , लेकिन इसके स्टैडआउट का प्रारूप (देखें man rsyncd.conf) नहीं।

उदाहरण के लिए, "फ़ाइल परिवर्तित!" वास्तव में परिवर्तित फ़ाइल के साथ प्रत्येक पंक्ति में, और फिर इसके grepलिए:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.