"Cp" खुली फ़ाइलों को कैसे संभालती है?


15

मैं दो अलग निर्देशिका कर रहा हूँ। उपयोगकर्ता किसी फ़ाइल को पहले लोड करता है। वहाँ एक cronjob पृष्ठभूमि में चल रहा है जो दूसरी निर्देशिका में हर 5 मिनट में फ़ाइलों की प्रतिलिपि बनाता है।

यदि उपयोगकर्ता ने अपना अपलोड पूरा नहीं किया है और क्रोनजॉब फ़ाइलों की प्रतिलिपि बनाता है तो क्या होगा? ध्यान दें कि दो निर्देशिका अलग-अलग उपयोगकर्ताओं के स्वामित्व में हैं, क्रोनजोब को रूट के रूप में किया जाता है।


ऐसी स्थिति में क्या होता है, यह देखने के लिए कृपया इस पोस्ट को पढ़ें: unix.stackexchange.com/questions/49299/…
सर्ज

धन्यवाद, अच्छी पोस्ट जो आपने लिखी है। लेकिन मेरा प्रश्न अधिक cp-related था, सामान्य रूप से linux-file-handle से नहीं। अगर फ़ाइल अभी भी खुली है और उसके बंद होने या कुछ होने तक इंतजार करता है, तो मैं शायद cp चेक करता हूँ।
स्टफ

cpजब तक फ़ाइल पूरी तरह से अपलोड नहीं हो जाती तब तक प्रतीक्षा नहीं होगी। जैसा कि हम उम्मीद करते हैं कि नेटवर्क ट्रांसफर दर एक ही होस्ट के अंदर फ़ाइल को एक स्थान से दूसरे स्थान पर कॉपी करने की तुलना में कम है, तो कुछ बिंदु पर cpवर्तमान एंड-ऑफ़-फ़ाइल तक पहुंच जाएगी और प्रतिलिपि बंद हो जाएगी। आपकी समस्या का समाधान सरल रूप से हो सकता है: पहले उपयोगकर्ता फ़ाइल को कुछ विशेष रूप से मंगाई गई फ़ाइल नाम के साथ अपलोड करता है (उदाहरण के लिए .(डॉट कैरेक्टर) के साथ पूर्वनिर्मित )। जब हस्तांतरण किया जाता है तो उपयोगकर्ता इसे मूल नाम में बदल देता है। फिर क्रोन जॉब दिखता है। उन फाइलों के लिए जो शुरू नहीं हो रही हैं .
सर्ज

जवाबों:


17

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


धन्यवाद, जो मैं जानना चाहता था! क्या इससे बचने का एक सरल तरीका है? मैंने cp मैन पेज को चेक किया लेकिन उपयोग का कुछ नहीं मिला।
स्टफ

वास्तव में क्या करना है? खुले लोगों को छोड़कर सभी फाइलों को कॉपी करने के लिए? मुझे नहीं लगता कि ऐसा करने का कोई आसान तरीका है (अपनी खुद की स्क्रिप्ट लिखने के अलावा जो fuser+ का उपयोग करता है cp। ऐसी प्रति वास्तव में बहुत अविश्वसनीय होगी। यह उदाहरण के लिए पाठ संपादक में खोली गई किसी भी फ़ाइल को कॉपी नहीं करेगी।
Krzysztof अदाम्सकी

@, शायद आपके क्रोनजोब में आप खुली फाइलों को सूचीबद्ध कर सकते हैं lsof? इसका उत्पादन प्रक्रिया को आसान बनाने के लिए होता है। आप cpलेखन के लिए खोली जा रही फ़ाइलों (जैसे, उदाहरण के लिए ) को फ़िल्टर कर सकते हैं ।
वोजटेक रेज़ेपला

@WojtekRzepala, मैं इस पर एक नज़र डालूंगा, धन्यवाद। हो सकता है कि मैं एक छोटी स्क्रिप्ट लिखूं जो क्रॉन्जॉब द्वारा निष्पादित हो जाती है
स्टफ

@Stuffy: ध्यान रखें कि यह वास्तव में विश्वसनीय नहीं हो सकता है यदि यह रूट उपयोगकर्ता द्वारा नहीं चलाया जाता है (यही समस्या fuserपाठ्यक्रम के साथ है) क्योंकि यह उपकरण सभी फाइलों को नहीं दिखा सकता है।
Krzysztof Adamski

7

cpपता नहीं क्या अन्य कार्यक्रमों की फाइलें खुली हो सकती हैं। इसमें कोई जादू नहीं है cp। यूनिक्स का डिज़ाइन उद्देश्यपूर्ण रूप से फ़ाइलों पर किसी भी प्रकार के ताले लगाने से बचता है जब तक कि कोई सम्मोहक कारण (कर्नेल की आवश्यकता को समझने के लिए मजबूर न हो)। इस विषय पर, देखें कि क्या फ़ाइल पर आउटपुट पुनर्निर्देशित करना फ़ाइल पर लॉक लागू करता है?

ऐसी स्थितियाँ, जहाँ एक निर्माता द्वारा एक फ़ाइल का उत्पादन किया जाता है और, एक बार उपभोक्ता द्वारा उपभोग किए जाने पर पूर्ण हो जाता है। इसे संभालने का सामान्य तरीका यह है कि निर्माता को एक अस्थायी फ़ाइल लिखनी है जिसे उपभोक्ता नहीं देखेगा, फिर एक बार निर्माता के समाप्त होने के बाद फ़ाइल को किसी ऐसी जगह ले जाएँ जहाँ उपभोक्ता उसे ढूंढेगा। एक फ़ाइल (एक ही फाइल सिस्टम पर) चलना एक परमाणु ऑपरेशन है: कुछ बिंदु पर, उपभोक्ता के लिए, फ़ाइल वहां नहीं होने से बदल जाती है।

इसलिए अपलोड के पूरा होने पर फ़ाइलों को किसी भिन्न निर्देशिका में ले जाने के लिए अपने अपलोड कार्य की व्यवस्था करें। इस अलग निर्देशिका में क्रॉन जॉब को इंगित करें।


6

ऐसा लगता है जैसे आप एक डीर सिंक काम करना चाहते हैं।

क्योंकि -u, --upate का विकल्पcp

केवल तभी कॉपी करें जब SOURCE फ़ाइल गंतव्य फ़ाइल से नई हो या जब गंतव्य फ़ाइल गायब हो

तो आप एक क्रोनजोब जोड़ सकते हैं जैसे कि cp -auv SOURCEDIR/* DESTDIRउन फाइलों को कॉपी करेंगे जिनके संशोधन का समय बदल गया है। इसका मतलब है कि DESTDIRआखिरकार पूरी कॉपी मिल जाएगी जबकि अपलोडिंग समाप्त हो गई है।

rsyncएक ही काम कर सकते हैं। जैसे, rsync -av SOURCEDIR/ DESTDIR

यद्यपि -a विकल्प लागू किया जाता है, कुछ निर्दिष्ट विशेषताओं (जैसे, स्वामित्व) को केवल सुपर-उपयोगकर्ता द्वारा संरक्षित किया जा सकता है।

देखें man cp, man rsyncजानकारी के लिए।


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