मैं पूरी तरह से एक क्रोनजॉब को / देव / नल / को कैसे चुप कराऊँ?


72

मेरे उबंटू-डेस्कटॉप पर और मेरे डेबियन-सर्वर पर मेरे पास एक स्क्रिप्ट है जिसे प्रत्येक मिनट (एक स्क्रिप्ट जिसे मेरे स्थान के मिनट-टिक को ऑनलाइन ब्राउज़रगेम कहते हैं ) निष्पादित करने की आवश्यकता है ।

समस्या यह है कि डेबियन व्युत्पन्न क्रोन पर /var/log/syslogहर बार इसे निष्पादित करने के लिए लॉगिंग होता है । मैं उस संदेश को बार-बार देख रहा हूं जिसे वह बार-बार निष्पादित करता था /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

मुझे पता है कि एक प्रोग्राम के आउटपुट को दबाने के लिए मैं इसे रीडायरेक्ट कर सकता हूं /dev/null, उदाहरण के लिए एक प्रोग्राम से सभी त्रुटि और चेतावनी संदेशों को छिपाने के लिए मैं इस तरह से crontab में एक लाइन बना सकता हूं

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

लेकिन मैं एक क्रोनजॉब चलाना चाहूंगा और यह सुनिश्चित करूंगा कि सभी उत्पन्न आउटपुट या त्रुटियां NULL को दी जाएं, इसलिए यह किसी भी संदेश को syslog में उत्पन्न नहीं करता है और न ही कोई ईमेल उत्पन्न करता है


EDIT:
क्रोन-लॉग को एक अलग लॉग में पुनर्निर्देशित करने का एक समाधान है जैसे कि यहां प्रस्तावित करके बदल दिया गया है/etc/syslog.conf

लेकिन दोष यह है कि तब सभी क्रोनोजर के सभी आउटपुट को पुनर्निर्देशित किया जाता है।

क्या मैं किसी तरह केवल एक ही क्रोनजोब को एक अलग लॉग फ़ाइल में पुनर्निर्देशित कर सकता हूं? अधिमानतः cron.hourlyफ़ाइल के अंदर ही कॉन्फ़िगर करने योग्य ।


2
आप केवल MAILTO=""क्रोन फ़ाइल की शुरुआत में भी डाल सकते हैं । यह सभी ईमेल को दबा देगा। और मैंने एक क्रोन डेमॉन के बारे में कभी नहीं सुना है जो कि साइज़लॉग को नौकरी आउटपुट भेजता है (लेकिन मुझे लगता है कि यह संभव है)।
पैट्रिक

@ पैट्रिक - वह सब कुछ अक्षम कर देगा, जो ठीक हो सकता है, लेकिन बस जागरूक रहें। मेरा अपडेट देखें, आप कई मेल्टो सेट कर सकते हैं।
SLM

हां, MAILTO=""कोंट्रेब की पहली पंक्ति किसी भी ईमेल को रोक देगी। साथ ही, यदि आप सभी आउटपुट को दबा रहे हैं, तो अपनी कमांड लाइनों पर पूर्ण ट्राइफेक्टा का उपयोग करें। इस स्ट्रिंग द्वारा सभी 3 प्रकारों को पुनर्निर्देशित किया गया है: >/dev/null 2>&1 - निश्चित रूप से, आपके पास अलग-अलग लॉग में आवधिक लिखों को शामिल कर सकते हैं।
एसडीसोलर

जवाबों:


119

इस लाइन बनाओ:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

यह STDOUT (1) और STDERR (2) दोनों को कैप्चर करेगा और उन्हें भेजेगा /dev/null

mailto

आप सेटिंग को ईमेल को अक्षम भी कर सकते हैं और फिर रीसेट कर सकते हैं MAILTO=""जो किसी भी ईमेल को भेजने को अक्षम कर देगा।

उदाहरण

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

अतिरिक्त संदेश

कई बार आपको निम्न प्रकार के संदेश प्राप्त होंगे /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

ये केवल क्रोन के माध्यम से सूचनाएं हैं कि क्रोनोजर की एक निर्देशिका निष्पादित की गई थी। इस संदेश का इन नौकरियों से सीधे तौर पर कोई लेना-देना नहीं है, इसके बजाय यह crondसीधे डेमॉन से आ रहा है । वास्तव में ऐसा कुछ भी नहीं है जो आप इन के बारे में कर सकते हैं, और मैं आपको इन को निष्क्रिय न करने के लिए प्रोत्साहित करूंगा, क्योंकि वे संभवत: crondलॉग्स के माध्यम से आपके पास केवल खिड़की है जो कि गोइंग्स में है ।

यदि वे आपको बहुत परेशान कर रहे हैं, तो आप हमेशा उन्हें अपनी /var/log/syslogफ़ाइल से बाहर निकालने के लिए एक वैकल्पिक लॉग फ़ाइल में निर्देशित कर सकते हैं , के लिए /etc/syslog.confकॉन्फ़िगरेशन फ़ाइल के माध्यम से syslog


@ rubo77 - क्या आप एक उदाहरण दिखा सकते हैं? मुझे यह देखना होगा कि इसके साथ क्या काम नहीं हो रहा है। Googling यह जाता जवाब के रूप में: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
SLM

यह सभी आउटपुट और ईमेल के लिए काम करता है, लेकिन यह अभी भी प्रत्येक क्रोन-कॉल के लिए / var / log / syslog
rubo77

@ rubo77 - यही मैंने सोचा था कि आप इसके बारे में पूछ रहे होंगे। आप उन संदेशों को रोक नहीं सकते हैं, वे क्रोन डेमॉन द्वारा ही उत्पन्न होते हैं।
स्लम

@ rubo77 - मुझे बदलने के बारे में पता है /etc/syslog.conf, मैं शायद ही इसे एक विकल्प मानूंगा। यह बस उस फ़ाइल को बदल देगा, जिसमें लॉग जमा हो जाते हैं या आप पूरी तरह से क्रोन संदेशों को पूरी तरह से अक्षम कर सकते हैं। ऐसा कोई तरीका नहीं है जो आप चाहते हैं।
SLM

1
@ rubo77 - जिस तरह से आप चाहते हैं, वैसा ही आप कर पाएंगे, अगर आप grep -v ...इनकाउंटर के बाद डालते हैं crond
SLM

10

एक स्क्रिप्ट है जिसे प्रत्येक मिनट निष्पादित करने की आवश्यकता है। समस्या यह है कि क्रोन हर बार निष्पादित होने पर / var / log / syslog में लॉगिंग कर रहा है। मैं अंत में बार-बार यह संदेश देखकर देख रहा था कि इसे / var / log / syslog पर ececuted किया गया है

चूँकि आप ऐसा कुछ भी नहीं करते हैं, इस पर रोक लगती है, यह पूछने योग्य है: वास्तव में यह स्क्रिप्ट क्या है और वास्तव में संदेश क्या है जो आप syslog में देखते हैं?

यदि स्लम का सुझाव काम नहीं करता है, तो इसका कारण यह है कि कुछ सीधे syslog में प्रवेश कर रहा है - या तो क्रोन, जैसा कि आपकी कुछ टिप्पणियों में निहित है, या फिर क्रोन द्वारा संचालित प्रक्रिया है। सिसलॉग को भेजे गए संदेश स्टडिन या स्टैडर से नहीं आते हैं, इसलिए 2>&1&>मदद नहीं करेगा।

प्रश्न में एप्लिकेशन के व्यवहार को कॉन्फ़िगर करने का एक तरीका हो सकता है, सिवाय इसके कि हम नहीं जानते कि यह क्या है।

संदेशों को विशेष रूप से फ़िल्टर करने के लिए निश्चित रूप से अधिकांश समकालीन syslog कार्यान्वयन (कई हैं) को कॉन्फ़िगर करने का एक तरीका है। उदाहरण के लिए, यदि लॉग संदेश में उपयोग किया गया कोई अनूठा टैग है, तो आप उसे लक्षित कर सकते हैं। लेकिन फिर से, जब से हम किसी विशेष संदेश के बारे में कुछ भी नहीं जानते हैं, या आप किस syslogd का उपयोग करते हैं, तो कुछ भी विशिष्ट नहीं है जिसे अनुशंसित किया जा सकता है।

मेरा सामान्य बिंदु यह है कि यदि आप संदेशों को रीडायरेक्ट / फ़िल्टर नहीं करना चाहते हैं क्योंकि "यह सभी संदेशों को रीडायरेक्ट करेगा", तो आप फ़िल्टरिंग तकनीक को परिष्कृत कर सकते हैं। सर्वर फाल्ट थ्रेड जिसे आपने सुविधा द्वारा फ़िल्टर करने का उल्लेख किया है ( *.cron) - लेकिन आप उससे अधिक विशिष्ट फ़िल्टर कॉन्फ़िगर कर सकते हैं


डेबियन और उबंटू दोनों में rsyslog उपलब्ध है। डेबियन 5+ पर यह डिफॉल्ट syslog है, ubuntu पर यह एक विकल्प है, इसलिए आपको इसे इंस्टॉल करना होगा। एक फ़िल्टर बनाने के लिए जो किसी प्रकार की विशिष्ट सामग्री को लक्षित करता है, इसे शीर्ष के पास रखें (यानी, किसी भी अन्य नियमों से पहले, लेकिन सामान्य कॉन्फ़िगरेशन, मॉड्यूल लोडिंग आदि के बाद) /etc/rsyslog.conf। ऐसा करने का सबसे अच्छा तरीका rsyslog.confस्वयं को संपादित करना नहीं है, बल्कि /etc/rsyslog.conf.d/निर्देशिका में एक फ़ाइल बनाना है , जिसमें दो अंकों के साथ नाम शुरू होता है जो 50 से कम है, अर्थात /etc/rsyslog.conf.d/15-my-filter.conf। आप वहाँ कुछ इस तरह से रख सकते हैं:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

यह संदेश भेजेगा /dev/null(या यदि आप चाहें तो एक अलग लॉग)। हालाँकि, संदेश अभी भी बाद के नियमों के माध्यम से पारित किया जाएगा जो इसे भेजते हैं /var/log/syslog। इसे रोकने के लिए:

& stop

इसके तुरंत बाद दूसरी लाइन। यह कुछ भी फेंकता है जो पूर्ववर्ती नियम से मेल खाता है। या, एकल-पंक्ति नियमों के लिए आप बस stopउस नियम रेखा के अंत में जोड़ सकते हैं ।

rsyslogdकॉन्फ़िगरेशन बदलने के बाद आपको पुनरारंभ करना होगा , (जैसे सिस्टमड सिस्टम पर systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP स्वयं को पुनः आरंभ करने का कारण बनता है।


Rsyslog के ~लिए अब हटा दिया गया है और इसे प्रतिस्थापित किया जाना चाहिए stoprsyslogd.confफ़ाइल में स्थिति भी मायने रखती है। तो rsyslog के लिए मैं बस का उपयोग करेगा :msg, contains, "/usr/bin/w3m -no-cookie" stop। और फिर पुनरारंभ करें sudo systemctl restart rsyslog
फ्रैंक

4

परिवर्तन /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

डिफ़ॉल्ट रूप से EXTRA_OPTSलाइन है""


2

/dev/nullकमांड से आउटपुट को छुपाने के लिए रीडायरेक्ट करना । यदि आप ऐसा नहीं करते हैं तो क्रोन आपको आउटपुट मेल करता है। कमांड से आउटपुट कभी सिस्टम लॉग में समाप्त नहीं होता है (कम से कम क्रोन के द्वारा नहीं)।

आमतौर पर आउटपुट को रीडायरेक्ट करने के लिए यह एक बुरा विचार है /dev/null, विशेष रूप से त्रुटि आउटपुट: यदि कुछ गलत होता है, तो आपको समस्या का निदान करने के लिए कोई जानकारी नहीं होगी। यदि आप मेल प्राप्त नहीं करना चाहते हैं, तो लॉग फ़ाइल में रीडायरेक्ट करें।

हालांकि इसमें से कोई भी आपकी समस्या के लिए प्रासंगिक नहीं है। आपके द्वारा उद्धृत संदेश क्रोन से ही है। क्रॉन हर बार लॉग प्रविष्टि लिखता है जब वह नौकरी चलाता है। कोई क्रॉन कार्यान्वयन जो मैंने देखा है, आपको विभिन्न नौकरियों के लिए अलग लॉगिंग कॉन्फ़िगरेशन का उपयोग करने की अनुमति देता है।

यदि आप कुछ नौकरियों को छोड़ना चाहते हैं, तो आपका एकमात्र विकल्प है कि आप syslog daemon में लॉग संदेशों में टेक्स्ट फ़िल्टरिंग लागू करें। Syslog फ़िल्टरिंग के लिए वास्तविक मानक rsyslog (जो आपके सिस्टम पर डिफ़ॉल्ट नहीं हो सकता है) को syslog daemon के रूप में चलाना है । इस विशेष आदेश को कैसे फ़िल्टर किया जाए, इसके लिए गोल्डीलॉक्स का उत्तर देखें ।

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