इन दो क्रोन नौकरियों में क्या गलत है?


13

मेरे पास निम्नलिखित क्रोन नौकरियां हैं।

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'

यह ठीक से काम करने लगता है अगर मैं इसे कमांड लाइन से सीधे ऊपर कमांड चलाता हूं। लेकिन जब मैंने आज सुबह स्क्रिप्ट चलाने की जाँच की, तो मुझे एक ई-मेल बताते हुए मिला (मैं गलती से कर रहा हूँ क्योंकि मैंने उन्हें गलती से हटा दिया था) कि पीछे की टिक ठीक से बंद नहीं हुई थी।


FYI करें मैंने अभी क्रोन नौकरियों को सेवानिवृत्त किया और निम्नलिखित त्रुटियां प्राप्त कीं। /bin/sh: 1: Syntax error: EOF in backquote substitution पहली क्रोन नौकरी के लिए। /bin/sh: 1: Syntax error: Unterminated quoted string दूसरी क्रोन नौकरी के लिए।
मार्क डी।

2
बैकटिक्स को इस कारण से हटा दिया जाता है ; बदलने के लिए $(...)आप उद्धरण
चिह्नों से

1
आप निश्चित रूप से मेरा एक सवाल जांचना चाहते हैं। इसका एक जवाब है स्टीफन चेज़ेलस, जो बताता है कि आप एक इंटरेक्टिव शेल कैसे बना सकते हैं जो आपके क्रॉन जॉब के वातावरण के समान होगा। यदि आप उसकी छोटी सी प्रक्रिया से चलते हैं, तो आपको एक संकेत मिलता है और आप अपने क्रोनजॉब स्टेप को स्टेप टेस्ट करके देख सकते हैं कि यह कहां विफल हो गया है। unix.stackexchange.com/a/56503/16841 निश्चित रूप से यह आपके प्रश्न के लिए 100% मैच नहीं है, लेकिन यह आपको crontab मुद्दों का निवारण करने में मदद कर सकता है।
jippie

जवाबों:


14

मैं कई कारणों से किसी भी गैर-तुच्छ क्रोन नौकरियों को अपने स्वयं के शेल स्क्रिप्ट फ़ाइल में डालने की सलाह देता हूं:

  • डिबग करने में आसान: आप एक लंबी लाइन को कॉपी करने की बजाय स्क्रिप्ट को चला सकते हैं, और सही शेबंग लाइन के साथ, यह अनुमान से अधिक व्यवहार करता है, जैसे कि आपके पास सीधे कमांडो में है
  • पढ़ने में आसान: इसे 200+ कैरेक्टर का वन-लाइनर बनाने की आवश्यकता नहीं है, आप इसे अच्छी तरह से फॉर्मेट कर सकते हैं ताकि सभी के लिए पढ़ना और समझना आसान हो
  • संस्करण नियंत्रण के लिए स्क्रिप्ट जोड़ें

8
और परेशान करने वाले %पात्रों को स्क्रिप्ट में डालने cronसे उन्हें नई कहानियों में बदलने से रोका जा सकेगा , जो कि आपकी वास्तविक समस्या है।
इयान डी। एलन

मैं असहमत हूं। आप भूल जाते हैं कि कौन सी स्क्रिप्ट क्या करती है। मैं अनुभव से बात कर रहा हूं।
श्रीधर सरनोबत

30

क्रॉन जॉब कमांड्स के तीन सामान्य कारण हैं जो सामान्य बुद्धि के मोटे क्रम में सीधे एक इंटरैक्टिव शेल में टाइप किए गए कमांड्स की तुलना में अलग व्यवहार करते हैं:

  • क्रोन एक सीमित वातावरण प्रदान करता है, उदाहरण के लिए, एक न्यूनतम $PATH, और अन्य अपेक्षित चर गायब हैं।
  • क्रोन /bin/shडिफ़ॉल्ट रूप से आह्वान करता है, जबकि आप कुछ अन्य शेल का अंतःक्रियात्मक रूप से उपयोग कर सकते हैं।
  • क्रोन %चरित्र को विशेष रूप से मानते हैं (इसे कमांड में एक नई रेखा में बदल दिया जाता है)।
  • क्रोन एक टर्मिनल या ग्राफिकल वातावरण प्रदान नहीं करता है।

आपको एक क्रॉस्टैब फ़ाइल में सभी %वर्णों से पहले होना चाहिए \, जो क्रॉन को केवल एक प्रतिशत कमांड में बताता है। याद रखें कि जब आप dateक्रॉन जॉब में कमांड का उपयोग करते हैं ।

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"

मैंने कुछ उद्धृत समस्याएं भी तय कीं:

  • यह आपको सुस्ती के अलावा अन्य समस्याओं का कारण नहीं बना रहा था, लेकिन आपको कमांड प्रतिस्थापन के लिए बैकटिक्स का उपयोग नहीं करना चाहिए। $(…)इसके बजाय उपयोग करें : इसके पार्सिंग नियम सरल हैं।
  • हमेशा के आसपास चर और आदेश प्रतिस्थापन दोहरे उद्धरण चिह्नों का उपयोग करें: "$somevariable", "$(somecommand)"। यहां उद्धरणों की कमी हानिरहित थी क्योंकि dateकमांड ने आपके द्वारा उपयोग किए गए प्रारूपों के लिए कोई विशेष चरित्र कभी नहीं लौटाया, लेकिन आपको ध्यान से याद रखना होगा कि कौन से वर्ण विशेष हैं और हर बार जब आप एक प्रतिस्थापन छोड़ते हैं तो इसे जांचें। इसे सरल रखें, हमेशा दोहरे उद्धरण चिह्नों का उपयोग करें जब तक कि आप परिणाम पर क्षेत्र विभाजन और फ़ाइल नाम नहीं चाहते।
  • आपके पास कुछ एकल कोट थे जो कुछ कमांड प्रतिस्थापन के आसपास विस्तार को रोकते थे। इसके बजाय दोहरे उद्धरण चिह्नों का उपयोग करें।

0

आप कमांड 'में नेस्टेड हैं mutt:

'से घटनाएँ date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d'

"आंतरिक के बजाय उपयोग करने का प्रयास करें 'ताकि बयान पढ़े

'से घटनाएँ date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d'


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