क्रोन के भीतर से किसी फ़ाइल में आउटपुट रीडायरेक्ट कैसे करें?


105

मेरे पास एक बैकअप स्क्रिप्ट है जिसे मुझे एक दिन के विशेष समय पर चलाने की आवश्यकता है इसलिए मैं cronइस कार्य के लिए उपयोग कर रहा हूं और क्रोन के भीतर से भी बैकअप स्क्रिप्ट के आउटपुट को पुनर्निर्देशित करने की कोशिश कर रहा हूं logfile

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

उपरोक्त क्रोन प्रविष्टि में मैं दोनों stderr and stdoutको लॉग फ़ाइल में पुनर्निर्देशित कर रहा हूं ।

उपरोक्त क्रोन जॉब के अनुसार ठीक syslog चलता है और यह backup.shफ़ाइल में उल्लिखित कार्य करता है लेकिन यह लॉग फ़ाइल में कुछ भी नहीं लिखता है।

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

जब मैं लिपियों से स्क्रिप्ट चलाता हूं तो यह आवश्यकतानुसार काम करता है और आउटपुट लॉग फाइल में लिखा जाता है

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

तो, फ़ाइल का आउटपुट क्रोन के भीतर से फ़ाइल पर पुनर्निर्देशित क्यों नहीं हो रहा है।


जवाबों:


158

मैंने समस्या हल कर दी। इसके दो तरीके हैं:

एम 1

से पुनर्निर्देशन बदलें &>>करने के लिए 2>&1। तो अब crontab -eलग रहा है

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

मेरा मानना ​​है कि उपरोक्त कार्य क्योंकि डिफ़ॉल्ट रूप cronसे shकार्य को चलाने के लिए उपयोग कर रहा है bashइसलिए इसके &>>द्वारा समर्थित नहीं है sh

M2

फ़ाइल SHELL=/bin/bashमें जोड़कर डिफ़ॉल्ट शेल बदलें crontab -e


14
cronयह पसंद है sh: यह एक एकल कार्यक्रम नहीं उठाता है। कई कार्यान्वयन हैं। सबसे प्रचलित कार्यान्वयन विक्सी क्रोन है। मैं दूसरे का लेखक (वर्तमान, मूल नहीं) हूं। मेरा मानना ​​है कि अधिकांश क्रोन डेमॉन सिस्टम का उपयोग करेंगे sh, लेकिन क्या यह स्वीकार कर सकता है &>>। कुछ क्रोन डेमोंस (जैसे मेरा) आपको बदलने में सक्षम नहीं करता है कि कौन सा शेल क्रोनब में लाइनों के साथ क्रोन लाइनों को निष्पादित करता है SHELL=...। मुझे खुशी है कि आपको एक समाधान मिला जो आपके लिए काम करता है; बस सोचा था कि यह इंगित करने लायक था कि कई चर हैं जो प्रभावित कर सकते हैं कि क्या यह दूसरों के लिए काम करता है।
dubiousjim

YYYY-MM-DD_hh-mm-secआउटपुट फ़ाइल नाम में कैसे सम्मिलित करें, ताकि हर फ़ाइल का नाम अलग हो और पुनर्लेखन के बिना रखा जाए?
दानिजेल


2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logएक ही बात भी करता है।
यानिक गिरौद

5

अस्वीकरण [१]।

मैं @ RanRag के जवाब में एक फुटनोट या परिशिष्ट जोड़ना चाहूंगा

सुनिश्चित करें कि आपका शेल पुनर्निर्देशन सिंटैक्स के अनुरूप है /bin/sh। यदि आप शेल पुनर्निर्देशन सिंटैक्स का उपयोग करने का प्रयास करते हैं जो /bin/shतब मान्य नहीं है तो आपकी कमांड विफल हो जाएगी और आपका क्रॉन जॉब कभी नहीं चलेगा।

/etc/cron.d/example1यदि आप किसी अन्य उपयोगकर्ता को निर्दिष्ट करते हैं rootऔर उस उपयोगकर्ता का लॉगिन शेल नहीं है, तो आपकी कॉन्फ़िगरेशन फ़ाइलों में /bin/bash... आपको अभी भी /etc/cron.d/example1कमांड में / बिन / श सिंटैक्स का उपयोग करना होगा ।


उदाहरण के लिए

अपने उपयोगकर्ता खोल दिया है cshया zshया kshअपने लॉगिन खोल के लिए निर्धारित किया है। आपकी /etc/cron.d/example1कॉन्फ़िग फ़ाइल में, कमांड को /bin/shसिंटैक्स का उपयोग करना चाहिए । विशेष रूप से कोई भी शेल पुनर्निर्देशन /bin/shसिंटैक्स होना चाहिए ।

यदि आप cshअपने में उदाहरण शेल पुनर्निर्देशन सिंटैक्स का उपयोग करने का प्रयास करते हैं /etc/cron.d/example1, तो आपकी क्रोन नौकरी कभी नहीं चलेगी। crondपर स्थित लॉगफ़ाइल यह /var/log/cronकहेगा कि कमांड चलाया जाता है, लेकिन कमांड आपके कमांड को चलाने से पहले एक सिंटैक्स त्रुटि के साथ त्रुटि करेगा।

crondसिंटैक्स त्रुटि के लिए त्रुटि संदेश कहाँ से निकलता है?

त्रुटि की रिपोर्ट कभी नहीं की जाती है /var/log/croncrondइसके बजाय डिफ़ॉल्ट रूप से किसी भी त्रुटि संदेश का उपयोग करता है mail। तो आपको यह देखने के /var/spool/mail/${USER}लिए जांचना चाहिए कि त्रुटि क्या है।

[1]

अस्वीकरण

  • यह उत्तर एक sysvप्रणाली मानता है
  • systemd जानकारी अलग हो सकती है
  • विशेष रूप से इस जानकारी के लिए सीखा था centos-6distro और विभिन्न करने के लिए लागू नहीं हो सकता sysvdistros
    • मैं centos-6विशेष रूप से उल्लेख करता हूं , क्योंकि विभिन्न डिस्ट्रोस का एक अलग crondकार्यान्वयन हो सकता है जो अलग- अलग होता हैcentos-6

2
यदि आप अपने /etc/cron.d/example1कमांड को एक अलग शेल का उपयोग करना चाहते हैं , तो आप SHELL=अपनी /etc/cron.d/example1कॉन्फ़िगरेशन फ़ाइल में सेट का उपयोग कर सकते हैं ।
ट्रेवर बॉयड स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.