एक cronjob खत्म करने के लिए पिछले rsync नौकरी के लिए प्रतीक्षा करें


11

मैं कुछ डेटा को एक सर्वर से दूसरे में बैकअप करने के लिए rsync का उपयोग कर रहा हूं। सभी ठीक काम करते हैं, लेकिन स्थानांतरण के लिए कितना डेटा है, इसके आधार पर इसे समाप्त होने में अधिक समय लग सकता है।

क्या यह सुनिश्चित करने का कोई तरीका है कि एक rsync आदेश एक cronjob का उपयोग करने से पहले समाप्त होने से पहले शुरू नहीं होता है?

उदाहरण के लिए, हर घंटे मैं rsync कमांड चलाता हूं, लेकिन इसके संभावित हस्तांतरण को पूरा होने में 1 घंटे से अधिक समय लगता है, इसलिए अगला एक पिछले खत्म होने से पहले शुरू होगा।


यदि नौकरी के संभावित रूप से पूरा होने में एक घंटे से अधिक समय लगता है, और आप इसे अवधि की तुलना में करीब निर्धारित कर रहे हैं, तो आप नौकरी को गलत तरीके से निर्धारित कर रहे हैं। या तो यह पता लगाएं कि समय पर कटौती कैसे करें या नौकरियों के बीच के अंतराल को बढ़ाएं। यदि आप लगातार दूरस्थ बैकअप कर रहे हैं, तो आप एक नई आपदा वसूली योजना पर विचार करना चाह सकते हैं।
vgoff

जवाबों:


11

आप किसी प्रकार के लॉकिंग को लागू कर सकते हैं। यह अभी भी चल रही rsync प्रक्रियाओं की संख्या को प्रिंट करेगा:

pgrep -cx rsync

और यह rsync तभी चलेगा जब कोई अन्य rsync प्रक्रिया मौजूद न हो:

pgrep -cx rsync || rsync ...

उपयोग करने -xसे अनजाने में अनचाहे नामों से मिलान करना बंद हो जाएगा (उदाहरण के लिए "fooba rsync hronizator" या "not_an_ rsync _totally" - यह ठीक उसी तरह काम करता है pgrep -c ^rsync$)


मामले में यह स्पष्ट नहीं है। -c उन प्रक्रियाओं की संख्या गिनाता है जिनका नाम rsync है। यदि यह 0 नहीं है, तो शेल परिणाम को सही (गलत नहीं) के रूप में व्याख्या करता है। || "या लाइनें" देखें पहला आइटम सत्य है और दूसरा आइटम, rsync चलाने के लिए परेशान न करें।
लूट

13

आप इसे करने में मदद करने के लिए झुंड कमांड का उपयोग कर सकते हैं । इस मामले flock -nमें शायद वही है जो आप चाहते हैं क्योंकि यह कमांड की तत्काल विफलता का कारण होगा अगर यह लॉक को प्राप्त नहीं कर सकता है जैसे।

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 

सामान्य तौर पर, दौड़ की स्थिति और / tmp निर्देशिका तक व्यापक पहुंच के कारण / tmp में अनुमानित फ़ाइल नाम अक्सर खतरनाक होते हैं। क्या यह इस मामले में सुरक्षित है?
mc0e

इस मामले में एक पूर्वानुमानित नाम न केवल सुरक्षित है, यह आवश्यक है; वह है जो लॉक (संज्ञा) लॉक (क्रिया) बनाता है। दूसरे शब्दों में, लॉक की स्थिति विशेष रूप से और पूरी तरह से एक विशिष्ट, अनुमानित, नाम के साथ फ़ाइल के अस्तित्व पर आधारित है। यदि फ़ाइल का नाम अप्रत्याशित था, या यदि यह गतिशील रूप से बदल गया है, तो झुंड rsync को उद्देश्य को हराते हुए, स्वयं को चलाने की अनुमति देगा। हालाँकि, आप अपनी चिंताओं को कम कर सकते हैं, और लॉक फ़ाइल को कहीं और डालकर, जैसे कि "अधिक सही" हो सकते हैं /var/run
इवान डे ला क्रूज़

3

यदि आप अन्य उपकरणों पर विचार करने के इच्छुक हैं, तो आप rdiff-backup पर भी नज़र डाल सकते हैं । यह बैकअप करने के लिए librsync का उपयोग करता है, और डेल्टास / वेतन वृद्धि की विन्यास संख्या को बचाता है। यह लॉक भी करता है ताकि किसी भी समय केवल एक ही rdiff- बैकअप प्रक्रिया चल सके।


मैं rdiff- बैकअप aswell का उपयोग करता हूं। लेकिन इस सेटअप में आपको सावधानी बरतने की जरूरत है क्योंकि rdiff-backup में rsync को पूरा करने में अधिक समय लगता है।
mgabriel

3

यहाँ मैं क्या करूँगा। लॉक फ़ाइल बनाने के लिए rsync के चारों ओर एक आवरण स्क्रिप्ट बनाएँ।

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script

2
बस एक रिबूट के बाद लॉक फ़ाइल को निकालना सुनिश्चित करें, अन्यथा आप एक ऐसी प्रक्रिया के साथ समाप्त हो सकते हैं जो फिर कभी नहीं चलती है।
जॉन गार्डनियर्स

2

मेरा उत्तर वही है जो माइक ने बताया था।

स्क्रिप्ट में, आपको कुछ इस तरह रखना चाहिए:

  • एक लॉक फ़ाइल बनाएँ
  • अगली बार इसे चलाने पर लॉक फ़ाइल के अस्तित्व की जाँच करें।

लेकिन एक बहुत महत्वपूर्ण चीज है जो आपको करनी चाहिए। और वह एक जाल प्रणाली को लागू करने के लिए।

तो, इसके साथ, आप जो कर सकते हैं, वह यह है कि भले ही किसी भी तरह आपकी स्क्रिप्ट को मार दिया जाए या किसी ने उसे मार दिया हो, तो आप उस सिग्नल को फंसा सकते हैं और लॉक फाइल को हटा सकते हैं, ताकि आपके पास बासी लॉक फाइल न हो।

आप पढ़ सकते हैं कि यहाँ पर कैसे लागू किया जाए ।

सिर्फ एक छोटी सी बात, आप सिग्नल 9 को नहीं फँसा सकते हैं, मेरा मतलब है कि अगर कोई करता है kill -9, तो आप उसे फँसा नहीं सकते क्योंकि उस सिग्नल को सीधे कर्नेल के साथ इंटरैक्ट करता है और उसे फंसाने का कोई तरीका नहीं है।

इसके अलावा, जैसा कि जॉन ने सुझाव दिया है, आपको अपने सिस्टम को रिबूट करने के लिए हर बार लॉक फाइल को हटाने की जरूरत है, बस यह सुनिश्चित करने के लिए कि कोई बासी फाइल नहीं बची है।

कि आप rm -f <FILE>/etc/rc.local में एक छोटी सी कमांड डालकर आसानी से कर सकते हैं


1

एएसी (धारावाहिक) स्विच के साथ एनाक्रोन (एनाक्रोनॉस्टिक क्रोन) पर एक नज़र है। यदि पिछले एक अभी भी चल रहा है, तो सीरियल यह सुनिश्चित करता है कि कमांड को फिर से नहीं बुलाया जाएगा।


आपको सवाल गलत लग सकता है।
जॉन गार्डनियर्स

मुझे ऐसा नहीं लगता। सवाल यह है कि "क्या यह सुनिश्चित करने का कोई तरीका है कि rsync आदेश पिछले एक cbjob का उपयोग करने से पहले शुरू न हो?" एनाक्रॉन अतिरिक्त / अलग कार्यक्षमता के साथ क्रोनोजर चलाता है। Serialize यह सुनिश्चित करता है कि आपके द्वारा कॉल की गई कोई भी कमांड पिछले एक खत्म होने तक शुरू न हो।
tu-Reinstate Monica-dor duh

मैं क्षमाप्रार्थी हूं। यह मैं था कि सवाल को गलत बताया।
जॉन गार्डनियर्स


0

मैं OSX पर काम करने के लिए mgabriel का समाधान नहीं पा सका क्योंकि pgrep का OSX संस्करण -c विकल्प नहीं लगता (मुझे लगता है कि यह गिनती के लिए है)। इसके बजाय मैंने निम्नलिखित का उपयोग किया:

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

मैंने एक उदाहरण कमांड के रूप में पिंग का उपयोग किया।

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.