कैसे अपने सभी crontab संबंधित संकट / समस्याओं (लिनक्स) को ठीक करने के लिए
यह एक सामुदायिक विकी है , यदि आप इस उत्तर के साथ कुछ भी गलत देखते हैं या अतिरिक्त जानकारी रखते हैं तो कृपया इसे संपादित करें।
सबसे पहले, बुनियादी शब्दावली:
- क्रोन (8) डेमॉन है जो अनुसूचित कमांड को निष्पादित करता है।
- crontab (1) उपयोगकर्ता crontab (5) फ़ाइलों को संशोधित करने के लिए उपयोग किया जाने वाला प्रोग्राम है।
- crontab (5) एक उपयोगकर्ता फ़ाइल है जिसमें cron (8) के लिए निर्देश हैं।
अगला, क्रोन के बारे में शिक्षा:
सिस्टम के प्रत्येक उपयोगकर्ता की अपनी crontab फ़ाइल हो सकती है। रूट और उपयोगकर्ता crontab फ़ाइलों का स्थान सिस्टम निर्भर है, लेकिन वे आम तौर पर नीचे हैं /var/spool/cron
।
एक सिस्टम-वाइड /etc/crontab
फ़ाइल है, /etc/cron.d
निर्देशिका में crontab टुकड़े हो सकते हैं जो क्रॉन द्वारा पढ़े और कार्रवाई किए जाते हैं। कुछ लिनक्स वितरण (जैसे, रेड हैट) भी हैं /etc/cron.{hourly,daily,weekly,monthly}
जो निर्देशिकाएं हैं, स्क्रिप्ट जिनके अंदर हर घंटे / दिन / सप्ताह / महीने को रूट विशेषाधिकार के साथ निष्पादित किया जाएगा।
रूट हमेशा crontab कमांड का उपयोग कर सकता है; नियमित उपयोगकर्ताओं को पहुंच प्रदान की जा सकती है या नहीं दी जा सकती है। जब आप crontab फ़ाइल को कमांड के साथ संपादित करते हैं crontab -e
और इसे सहेजते हैं, तो crond इसे मूल वैधता के लिए जाँचता है लेकिन यह गारंटी नहीं देता कि आपकी crontab फ़ाइल सही रूप से बनाई गई है। एक फाइल है जिसे cron.deny
निर्दिष्ट किया जाएगा कि कौन से उपयोगकर्ता क्रोन का उपयोग नहीं कर सकते हैं। cron.deny
फ़ाइल स्थान प्रणाली निर्भर है और नष्ट कर दिया जा सकता है जो सभी उपयोगकर्ताओं क्रॉन का उपयोग करने की अनुमति देगा।
यदि कंप्यूटर संचालित नहीं होता है या क्रोन डेमॉन नहीं चल रहा है, और कमांड चलाने के लिए दिनांक / समय बीत चुका है, तो क्रोनअप पिछले प्रश्नों को पकड़ नहीं पाएगा।
कोंट्राब विवरण, कैसे एक आदेश तैयार करने के लिए:
एक क्रॉस्टैब कमांड को एक लाइन द्वारा दर्शाया गया है। आप \
कई लाइनों पर एक कमांड का विस्तार करने के लिए उपयोग नहीं कर सकते हैं। हैश ( #
) चिन्ह एक टिप्पणी का प्रतिनिधित्व करता है जिसका अर्थ है कि उस रेखा पर कुछ भी क्रोन द्वारा अनदेखा किया गया है। अग्रणी व्हाट्सएप और रिक्त लाइनों को अनदेखा किया जाता है।
%
अपने आदेश में प्रतिशत ( ) चिह्न का उपयोग करते समय बहुत सावधान रहें । जब तक वे बच नहीं जाते हैं, तब तक वे नए \%
मामलों में परिवर्तित हो जाते हैं और पहले गैर-भागने के बाद सब कुछ %
स्टड पर आपकी कमान में चला जाता है।
Crontab फ़ाइलों के लिए दो प्रारूप हैं:
उपयोगकर्ता crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
प्रणाली चौड़ी /etc/crontab
और /etc/cron.d
टुकड़े
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
ध्यान दें कि बाद वाले को उपयोगकर्ता-नाम की आवश्यकता होती है। कमांड को नामित उपयोगकर्ता के रूप में चलाया जाएगा।
लाइन के पहले 5 क्षेत्र उस समय (एस) का प्रतिनिधित्व करते हैं जब कमांड चलाया जाना चाहिए। आप समय विनिर्देश में संख्याओं या जहां लागू दिन / महीने के नाम का उपयोग कर सकते हैं।
- खेतों को रिक्त स्थान या टैब द्वारा अलग किया जाता है।
- अल्पविराम (
,
) का उपयोग किसी सूची को निर्दिष्ट करने के लिए किया जाता है जैसे 1,4,6,8 जिसका अर्थ है 1,4,6,8।
- रंग डैश के साथ निर्दिष्ट किए गए हैं (
-
) और सूचियों के साथ जोड़ा जा सकता है उदाहरण के लिए 1-3,9-12 जिसका अर्थ है 1 से 3 और फिर 9 और 12 के बीच।
/
चरित्र एक कदम जैसे 2/5 जो 2 से शुरू होने का मतलब है तो हर 5 पेश करने (2,7,12,17,22 ...) का इस्तेमाल किया जा सकता है। वे अंत से अतीत नहीं लपेटते हैं।
*
किसी फ़ील्ड में तारांकन ( ) उस फ़ील्ड के लिए संपूर्ण श्रेणी को दर्शाता है (उदाहरण 0-59
के लिए मिनट फ़ील्ड)।
- रंग और चरणों को संयुक्त किया जा सकता है जैसे
*/2
कि संबंधित क्षेत्र के लिए न्यूनतम से शुरू होने का संकेत तब प्रत्येक 2 उदा 0 मिनटों के लिए (0,2 ... 58), 1 महीनों के लिए (1,3 ... 11) आदि।
क्रोन कमांड डिबगिंग
संदेशा जांचना!
डिफ़ॉल्ट रूप से क्रोन कमांड से किसी भी आउटपुट को उस उपयोगकर्ता के पास भेज देगा जो यह कमांड चला रहा है। अगर कोई आउटपुट नहीं है तो कोई मेल नहीं होगा। यदि आप क्रोन को एक अलग खाते में मेल भेजना चाहते हैं तो आप MAILTO पर्यावरण चर को crontab फ़ाइल उदा में सेट कर सकते हैं
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
आउटपुट को स्वयं कैप्चर करें
आप किसी फ़ाइल में stdout और stderr को पुनर्निर्देशित कर सकते हैं। आउटपुट कैप्चर करने का सटीक सिंटैक्स, शेल क्रोन का उपयोग करने के आधार पर भिन्न हो सकता है। यहां दो उदाहरण दिए गए हैं जो सभी आउटपुट को फ़ाइल में सहेजते हैं /tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
लॉग को देखो
क्रोन अपने कार्यों को सिसलॉग के माध्यम से लॉग करता है, जो (आपके सेटअप के आधार पर) अक्सर /var/log/cron
या पर जाते हैं /var/log/syslog
।
यदि आवश्यक हो तो आप उदाहरण के साथ क्रोन स्टेटमेंट को फ़िल्टर कर सकते हैं
grep CRON /var/log/syslog
अब जब हम क्रोन की मूल बातें खत्म कर चुके हैं, जहां फाइलें हैं और उनका उपयोग कैसे किया जाए तो आइए कुछ सामान्य समस्याओं पर ध्यान दें।
जांचें कि क्रोन चल रहा है
यदि क्रोन नहीं चल रहा है, तो आपके आदेश शेड्यूल नहीं किए जाएंगे ...
ps -ef | grep cron | grep -v grep
आपको ऐसा कुछ मिलना चाहिए
root 1224 1 0 Nov16 ? 00:00:03 cron
या
root 2018 1 0 Nov14 ? 00:00:06 crond
यदि इसे पुनः आरंभ नहीं किया गया
/sbin/service cron start
या
/sbin/service crond start
अन्य विधियां हो सकती हैं; जो आपके डिस्ट्रो प्रदान करता है उसका उपयोग करें।
cron आपके आदेश को प्रतिबंधित वातावरण में चलाता है।
पर्यावरण चर उपलब्ध हैं जो बहुत सीमित होने की संभावना है। आमतौर पर, आप केवल इस तरह के रूप में परिभाषित किया कुछ चर, मिल जाएगा $LOGNAME
, $HOME
और $PATH
।
विशेष रूप से नोट के PATH
लिए प्रतिबंधित है /bin:/usr/bin
। "मेरी क्रोन स्क्रिप्ट काम नहीं करती है" का अधिकांश हिस्सा इस प्रतिबंधात्मक पथ के कारण होता है । यदि आपका आदेश किसी भिन्न स्थान पर है, तो आप इसे कुछ तरीकों से हल कर सकते हैं:
अपनी आज्ञा को पूरा मार्ग प्रदान करें।
1 2 * * * /path/to/your/command
Crontab फ़ाइल में उपयुक्त PATH प्रदान करें
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
यदि आपके कमांड को अन्य पर्यावरण चर की आवश्यकता है, तो आप उन्हें crontab फ़ाइल में भी परिभाषित कर सकते हैं।
cron आपके कमांड को cwd == $ HOME के साथ चलाता है
भले ही आप जिस प्रोग्राम को निष्पादित करते हैं, वह फाइलसिस्टम पर रहता है, प्रोग्राम का वर्तमान वर्किंग डाइरेक्टरी जब क्रोन चलता है तो वह यूजर का होम डायरेक्टरी होगा । यदि आप अपने प्रोग्राम में फ़ाइलों को एक्सेस करते हैं, तो आपको इसे ध्यान में रखना होगा यदि आप सापेक्ष पथों का उपयोग करते हैं, या (अधिमानतः) हर जगह पूरी तरह से योग्य पथों का उपयोग करते हैं, और सभी को बहुत सारे भ्रम से बचाते हैं।
मेरे crontab में अंतिम कमांड नहीं चलती है
क्रॉन को आम तौर पर आवश्यकता होती है कि कमांड को एक नई लाइन के साथ समाप्त किया जाए। अपने crontab संपादित करें; उस पंक्ति के अंत में जाएं, जिसमें अंतिम कमांड है और एक नई लाइन डालें (एंटर दबाएं)।
Crontab प्रारूप की जाँच करें
आप / etc / crontab या /etc/cron.d और इसके विपरीत में टुकड़े के लिए एक उपयोगकर्ता crontab स्वरूपित crontab का उपयोग नहीं कर सकते हैं। एक उपयोगकर्ता स्वरूपित crontab में पंक्ति की 6 वीं स्थिति में एक उपयोगकर्ता नाम शामिल नहीं है, जबकि एक सिस्टम स्वरूपित crontab में उपयोगकर्ता नाम शामिल है और उस उपयोगकर्ता के रूप में कमांड चलाता है।
मैंने /etc/cron में एक फ़ाइल डाल दी है।
- जाँच करें कि फ़ाइल नाम में रन-पार्ट्स देखने का एक्सटेंशन नहीं है
- सुनिश्चित करें कि फ़ाइल ने अनुमतियाँ निष्पादित की हैं।
- अपनी स्क्रिप्ट निष्पादित करते समय उपयोग करने के लिए सिस्टम को बताएं (उदाहरण के लिए
#!/bin/sh
शीर्ष पर रखें)
क्रोन की तारीख संबंधित कीड़े
यदि आपकी तिथि को हाल ही में उपयोगकर्ता या सिस्टम अपडेट, टाइमज़ोन या अन्य द्वारा बदल दिया जाता है, तो क्रॉस्टैब गलत तरीके से व्यवहार करना शुरू कर देगा और विचित्र कीड़े दिखाएगा, कभी-कभी काम कर रहा है, कभी-कभी नहीं। जब यह समय इसके नीचे से बदल जाता है, तो "आप क्या चाहते हैं" करने की कोशिश करने के लिए क्रॉस्टैब का प्रयास है। घंटे बदलने के बाद "मिनट" फ़ील्ड अप्रभावी हो जाएगी। इस परिदृश्य में, केवल तारांकन स्वीकार किया जाएगा। क्रोन को फिर से शुरू करें और इंटरनेट से कनेक्ट किए बिना इसे फिर से आज़माएं (इसलिए तिथि के पास एक समय सर्वर पर रीसेट करने का मौका नहीं है)।
प्रतिशत के संकेत, फिर से
प्रतिशत संकेतों के बारे में सलाह पर जोर देने के लिए, यहां क्रोन उनके साथ क्या करता है, इसका एक उदाहरण है:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
~ 3 लाइनों वाली ~ / cron.out फ़ाइल बनाएगा
foo
bar
baz
date
कमांड का उपयोग करते समय यह विशेष रूप से घुसपैठ है । प्रतिशत संकेतों से बचना सुनिश्चित करें
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"