find -delete ठीक काम करता है, लेकिन क्रोन के साथ नहीं


10

कृपया ध्यान दें : मैंने सभी समान प्रश्नों को फिर से पढ़ा है। क्रोन, पथ, एनवी चर और इतने पर, लेकिन कोई भी नहीं मिला है जो मेरी विशेष समस्या के समाधान की पेशकश करता है।


मेरे पास एक स्क्रिप्ट है जो कुछ MySQL डंप बनाती है और फिर पुराने लोगों को इस तरह हटा देती है:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

( टिप्पणी से सुझावों द्वारा मेरी मूल कमान से ऊपर आदेश को संशोधित किया गया है )

हालाँकि, जब क्रोन इस स्क्रिप्ट को चलाता है तो फाइलें कभी डिलीट नहीं होती हैं। क्रोन उपयोगकर्ता रूट है।

नोट डीबग करना

  • यदि मैं उस स्क्रिप्ट को मैन्युअल रूप से चलाता हूं जिसमें कमांड दिखाई देती है, तो यह उन्हें अपेक्षित रूप से हटा देता है।

  • यदि मैं उपर्युक्त खोज कमांड को कमांड लाइन से रूट के रूप में चलाता हूं, तो यह उन्हें अपेक्षित रूप से हटा देता है (और -प्रिंट के साथ यह अपेक्षा के अनुसार 5 दिनों से अधिक पुरानी फाइलों की सूची लौटाता है)

  • मैंने रूट के crontab के लिए एक स्पष्ट पथ विवरण भी जोड़ा है, लेकिन
    इससे कुछ भी नहीं बदलता है।

  • क्रोन कोई त्रुटि नहीं भेजता है, और यदि मैं एक लॉग फ़ाइल में खोज ऑपरेशन को पाइप करता हूं,
    जो खाली आता है या बिल्कुल नहीं बनाया जाता है।

  • मैं Ubuntu सर्वर 14.04.03 LTS का उपयोग कर रहा हूं।


मैं मार्ग में वाइल्डकार्ड विस्तार (जैसे * .gz) से बचूंगा। cron * .gz के रूप में व्याख्या कर सकता है, सभी gz फ़ाइलों का विस्तार नहीं कर रहा है।
आर्केमरे

यदि आप बिना किसी कार्रवाई के काम चलाते हैं तो आपको क्या आउटपुट मिलेगा/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemar वाइल्डकार्ड का विस्तार क्यों नहीं होगा? cronकमांड शेल के माध्यम से चलाए जाते हैं, और शेल वाइल्डकार्ड का विस्तार करता है।
बरमार

cronआउटपुट और त्रुटि संदेशों के साथ ईमेल भेजना चाहिए। क्या आपको इस नौकरी से कोई ईमेल मिलता है?
बरमार

@ अगर यह उम्मीद के मुताबिक काम करता है।
टॉमीपीनट्स

जवाबों:


6

समस्या यह है कि जब यह चलता है crontabतो $PATHसेट नहीं होता है । आप वास्तव में इसे एक पथ के साथ प्रदान कर सकते हैं जो इसे खोली गई फ़ाइल के शीर्ष पर जोड़ सकता है crontab -e:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

(या जो भी PATHआप उपयोग करना चाहते हैं)। इसका मतलब है कि आप कमांडों से सीधे पूरे रास्ते को निर्दिष्ट करने से बच सकते हैं, सीधे क्रोन से।

आपके मूल आदेश के साथ कई समस्याएं हैं। आप मूल रूप से शेल को वाइल्डकार्ड विस्तार करने के लिए कह रहे हैं, बजाय find। दूसरे, आप एक पूर्ण पथ प्रदान नहीं कर रहे हैं rm; उपयोग /bin/rmया /usr/bin/rm, जहां भी यह आपके सिस्टम पर स्थित है (देखें which rm)।

खोजने के लिए पहला तर्क "खोज करने का स्थान" है, और फिर आप विभिन्न -<option>एस के साथ "खोज क्वेरी" निर्दिष्ट करते हैं । तो, जिस कमांड को आप चलाना चाहते हैं उसका उचित प्रारूप है:

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;

या

find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

यदि आप निर्दिष्ट नहीं करते हैं PATH ऊपर परिभाषा हैं, तो उपयोग करें:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;

या

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete

1
यह $PATHसेट होना चाहिए , लेकिन यह सिस्टम का डिफ़ॉल्ट होगा। इसमें शामिल होगा /usr/binऔर /bin, इसलिए इसे rmकमांड को खोजने में सक्षम होना चाहिए ।
बरमार

इसलिए मैंने कॉटैब में $ PATH डालने की कोशिश की (हालांकि जैसा कि कहीं और बताया गया है कि यह सिस्टम पथ के लिए डिफ़ॉल्ट होगा यदि नहीं कहा गया है), और सुनिश्चित करें कि सब कुछ पूर्ण पथ था। मैंने भी खोज पथ पर वाइल्डकार्ड के बजाय "* .gz" का उपयोग किया। लेकिन ऐसा कुछ नहीं होता है। कमांड सिर्फ चलाने के लिए नहीं लगती है और इसमें कोई त्रुटि नहीं होती है।
टॉमीपीनट्स

3

इसके बजाय यह प्रयास करें

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

आप किसी फ़ाइल में स्टेटर को पुनर्निर्देशित क्यों करेंगे? डिफ़ॉल्ट रूप से यह ईमेल द्वारा भेजा जाएगा यदि कोई आउटपुट था।
कैस्परडी

हां यह सही है कि डिफ़ॉल्ट रूप से उपयोगकर्ता के स्पूलर मेल को कोई भी ईमेल भेज रहा है और उसे मेल का उपयोग करके पढ़ा जा सकता है।
shad0VV

1
मूल कमांड के समान प्रभाव प्राप्त करने के लिए आपको जोड़ना होगा -maxdepth 1
Niels Keurentjes

0

अगर मैं रूट कमांड के क्रॉस्टैब से स्क्रिप्ट कमांड को सीधे आमंत्रित करता हूं और स्क्रिप्ट के हिस्से के रूप में नहीं, तो यह काम करता है।

प्रश्न में स्क्रिप्ट csh का उपयोग करती है। मेरा मानना ​​है कि उबंटू पर रूट का क्रोन वातावरण / बिन / बैश (या / बिन / डैश?) का उपयोग करेगा। शायद यह किसी तरह से इस बात के साथ संघर्ष करता है कि खोज कमांड कैसे चल रहा था।

किसी भी तरह से, मुख्य मुद्दा यह हल किया, यद्यपि कुछ असमान रूप से।

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