यदि अपाचे किसी जगह पर किसी तरह की एक फाइल लिख रहा है और उसने लिखना पूरा नहीं किया है और फिर उसमें rsync
किक करता है, तोrsync
जो कुछ भी वहां बैठा है उसे कॉपी करेगा।
मतलब अगर अपाचे 5MB फ़ाइल के साथ काम कर रहा है, तो केवल 2MB लिखा है और इसमें rsync
किक करता है, आंशिक 2MB फ़ाइल की प्रतिलिपि बनाई जाएगी। तो ऐसा लगता है कि फ़ाइल गंतव्य सर्वर पर "दूषित" है।
आपके द्वारा उपयोग की जा रही फ़ाइलों के आकार के आधार पर, आप निम्न करने के लिए --inplace
विकल्प का उपयोग कर सकते हैं rsync
:
यह विकल्प बदलता है कि फ़ाइल के डेटा को अपडेट करने के लिए rsync किसी फ़ाइल को कैसे स्थानांतरित करता है: फ़ाइल की नई प्रतिलिपि बनाने की डिफ़ॉल्ट विधि के बजाय और इसे पूरा होने पर इसे स्थानांतरित करने के बजाय, rsync इसके बजाय अद्यतन किए गए डेटा को सीधे गंतव्य पर भेजता है फ़ाइल।
इसका लाभ यह है कि यदि 5MB फ़ाइल में पहले रन पर केवल 2MB कॉपी है, तो अगला रन 2MB पर आएगा और फ़ाइल की प्रतिलिपि तब तक जारी रहेगी जब तक कि पूर्ण 5MB नहीं हो जाता।
नकारात्मक यह है कि यह एक ऐसी स्थिति बना सकता है जहां कोई व्यक्ति वेब सर्वर तक पहुंच रहा है, जबकि एक फ़ाइल की प्रतिलिपि बनाई जा रही है और फिर उन्हें एक आंशिक फ़ाइल दिखाई देगी। मेरी राय rsync
में यह एक "अदृश्य" फ़ाइल को कैशिंग के डिफ़ॉल्ट व्यवहार में सबसे अच्छा काम करता है और फिर इसे तुरंत जगह में स्थानांतरित करना है। लेकिन --inplace
उन परिदृश्यों के लिए अच्छा है जहां बड़ी फ़ाइलों और बैंडविड्थ की कमी एक वर्ग के आसानी से कॉपी की जा रही बड़ी फ़ाइल के रास्ते में खड़ी हो सकती है।
यह कहा कि आप यह राज्य करते हैं; जोर मेरा है:
हर पांच मिनट में क्रोन रन rsync है ...
तो मुझे लगता है कि आपके पास इस क्रॉन जॉब को प्रबंधित करने के लिए कुछ बैश स्क्रिप्ट है? खैर, यह बात बहुत rsync
ही स्मार्ट है कि केवल उन फ़ाइलों को कॉपी करें जिन्हें कॉपी करने की आवश्यकता है। और अगर आपके पास एक स्क्रिप्ट है जो हर 5 मिनट में चलती है तो ऐसा प्रतीत होता है कि आप rsync
तेजी से आगे बढ़ने पर एक दूसरे पर कदम रखने से बचने की कोशिश कर रहे हैं । मतलब, यदि आप इसे हर मिनट चलाते हैं, तो एक जोखिम है कि एक या अधिक rsync
प्रक्रियाएं अभी भी फ़ाइल आकार या नेटवर्क की गति के कारण चल रही हैं और अगली प्रक्रिया बस इसके साथ प्रतिस्पर्धा में होगी; एक रेसिंग हालत।
इससे बचने का एक तरीका यह है कि आप अपने पूरे rsync
कमांड को बैश स्क्रिप्ट में लपेट दें , जो फ़ाइल लॉक की जांच करता है; नीचे एक बॉयलरप्लेट बैश स्क्रिप्ट फ्रेमवर्क है जो मैं इस तरह के मामलों के लिए उपयोग करता हूं।
ध्यान दें कि कुछ लोग उपयोग करने की सलाह देंगे, flock
लेकिन चूंकि flock
मैं उपयोग किए जाने वाले कुछ सिस्टम पर स्थापित नहीं हूं - और मैं उबंटू (जो इसके पास है) और मैक ओएस एक्स (जो नहीं करता है) के बीच कूदता है - मैं बिना किसी वास्तविक मुद्दे के इस सरल ढांचे का उपयोग करता हूं:
LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'
if mkdir ${LOCK_DIR} 2>/dev/null; then
# If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
echo $$ > ${PID_FILE}
echo "Hello world!"
rm -rf ${LOCK_DIR}
exit
else
if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
# Confirm that the process file exists & a process
# with that PID is truly running.
echo "Running [PID "$(cat ${PID_FILE})"]" >&2
exit
else
# If the process is not running, yet there is a PID file--like in the case
# of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
rm -rf ${LOCK_DIR}
exit
fi
fi
विचार यह है कि सामान्य कोर-जहां मेरे पास है-जहां echo "Hello world!"
आपकी स्क्रिप्ट का दिल है। बाकी यह मूल रूप से एक लॉकिंग तंत्र / तर्क पर आधारित है mkdir
। इस उत्तर में अवधारणा की एक अच्छी व्याख्या है :
mkdir एक निर्देशिका बनाता है यदि यह अभी तक मौजूद नहीं है, और यदि ऐसा होता है, तो यह एक निकास कोड सेट करता है। इससे भी महत्वपूर्ण बात, यह एक एकल परमाणु क्रिया में यह सब करता है जिससे यह इस परिदृश्य के लिए एकदम सही है।
तो आपकी rsync
प्रक्रिया के मामले में , मैं केवल इस echo
कमांड का उपयोग करके कमांड को आपकी rsync
कमांड में बदलने की सलाह दूंगा। इसके अलावा, LOCK_NAME
कुछ को बदलें RSYNC_PROCESS
और फिर आप जाने के लिए अच्छे हैं।
अब rsync
इस लिपि में लिपटे होने के साथ , आप बिना किसी रेसिंग स्थिति के जोखिम के हर मिनट को चलाने के लिए क्रोन जॉब सेट कर सकते हैं जहां दो या अधिक rsync
प्रक्रियाएं एक ही काम करने के लिए लड़ रही हैं। यह आपको गति या rsync
अपडेट बढ़ाने की अनुमति देगा जो आंशिक फ़ाइलों के हस्तांतरण को समाप्त नहीं करेगा, लेकिन यह समग्र प्रक्रिया को गति देने में मदद करेगा ताकि पूरी फ़ाइल को किसी बिंदु पर ठीक से कॉपी किया जा सके।