मैं प्रोग्रामिक रूप से एक नई क्रॉन जॉब कैसे बना सकता हूं?


129

मैं प्रोग्राम क्रोन जॉब में सक्षम होना चाहता हूं, ऐसा करने का सबसे अच्छा तरीका क्या है?

से अपना शोध , ऐसा लगता है मैं वर्तमान crontab डंप कर सकता है और उसके बाद एक नया एक संलग्न, crontab में कि वापस पाइप:

(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -

क्या कोई बेहतर तरीका है?


2
आपका समाधान अच्छा लगता है।
क्रेग एस

सोलारिस पर अंतिम क्रेसब के लिए डैश हटा दें। आप पहले से ही वहां एक लाइन जोड़ने से बचने के लिए एक grep जोड़ सकते हैं।
लैक्रोइक्स 1547


कोष्ठक के बजाय घुंघराले ब्रेसिज़ एक प्रक्रिया को जन्म दिए बिना कर लेंगे। ब्रेसिज़ के आसपास रिक्त स्थान रखना सुनिश्चित करें, {...; }।
जे विंस्टन

जवाबों:


-25

मेरे लिए यह हमेशा अच्छा रहा है।

आपको थोड़ा अधिक परिष्कृत स्क्रिप्ट पर विचार करना चाहिए जो तीन चीजें कर सकता है।

  1. एक क्रॉस्टैब लाइन को जोड़ो; आश्वासन दिया कि यह मौजूद नहीं था। पहले से मौजूद होने पर जोड़ना बुरा है।

  2. Crontab लाइन निकालें। शायद केवल चेतावनी अगर यह मौजूद नहीं था।

  3. क्रॉस्टब लाइन को बदलने के लिए उपरोक्त दो विशेषताओं का संयोजन।


78
वह पूछता है कि आप उसे कैसे और क्या कहते हैं?
सेरिन

1
क्या होगा यदि उपयोगकर्ता के पास अभी तक एक क्रॉस्टैब नहीं है?
मैक्सिम इगोरुशिन

132

यदि आप रूट के रूप में चल रहे हैं, तो सबसे अच्छा तरीका है कि आप किसी फ़ाइल को /etc/cron.d में छोड़ दें

यदि आप अपने सॉफ़्टवेयर को पैकेज करने के लिए पैकेज मैनेजर का उपयोग करते हैं, तो आप बस उस निर्देशिका में फ़ाइलें रख सकते हैं और उनकी व्याख्या की जाती है जैसे कि वे crontabs थे, लेकिन उपयोगकर्ता नाम के लिए एक अतिरिक्त फ़ील्ड के साथ, जैसे:

फ़ाइल का नाम: /etc/cron.d/per_minute

सामग्री: * * * * * root /bin/sh /home/root/script.sh


5
बस सुनिश्चित करें कि उपयोग में क्रोन का संस्करण /etc/cron.d/ का समर्थन करता है। अधिकांश आधुनिक लिनक्स वितरण करते हैं।
11

8
यह सबसे सरल, सबसे सुरुचिपूर्ण समाधान है। सुनिश्चित करें कि अन्य गैर-संबंधित प्रविष्टियों के साथ एक मौजूदा क्रॉस्टेट को पार्स और संपादित करने के लिए धड़कता है।
सेरिन

13
इस के लिए एक संभावित चेतावनी वह आवृत्ति है जिस पर क्रोन इस फ़ोल्डर में नए परिवर्धन (प्रति घंटे एक बार) करता है। यदि आप अपना काम तुरंत शुरू करने की उम्मीद कर रहे हैं, तो सावधान रहें।
जोनाथनके

6
@ जोनाथन, क्या आपको पता है कि क्रोन को फिर से स्कैन करने के लिए कहा जा सकता है /etc/cron.d/*? यह जानना मुश्किल है कि क्या कुछ काम कर रहा है अगर किसी को जांच के लिए एक घंटे तक इंतजार करना पड़ता है!
15

4
इस फ़ाइल की अनुमति कैसे दी जानी चाहिए? chmod + x /etc/cron.d/per_minute?
जि।

101

ओपी के समाधान में एक बग है, यह प्रविष्टियों को दो बार जोड़ा जा सकता है, ठीक करने के लिए नीचे का उपयोग करें।

(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -

5
यह वास्तव में एक बेहतर है यदि समाधान नहीं बताया गया है। यह सुनिश्चित करता है कि कमांड को क्रॉस्टैब में दो बार नहीं जोड़ा गया है।
बुफ्के

2
डुप्लिकेट एंट्री इश्यू के लिए यह शायद ही एक अच्छा फिक्स है। यदि इस बीच क्रॉस्टैब में एक और रेखा जोड़ दी गई तो क्या होगा?
hmn

6
अद्वितीयता सुनिश्चित करने के लिए, ठीक sortपहले uniq, जैसे:(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
मार्ग

6
की कोई जरूरत नहीं uniq-uपर विकल्प का उपयोग करें sort
पपीरो

6
जब मैं पहली बार क्रॉस्टेब संपादित करता हूं तो उपयोगकर्ता के लिए कोई क्रॉस्टैब से बचने के लिए कैसे ।
13

23

क्रोन में कुछ जोड़ना

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -

इसे क्रोन से हटाने के लिए

(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh |  sort | uniq | crontab -

आशा है कि किसी की मदद करेंगे


यह वही है जो मैं देख रहा था मैं इसे बस जोड़ूंगा: | grep -v '^ #' | टिप्पणियों को फ़िल्टर करने के लिए
Tjunkie

2
आपको वास्तव में इसकी आवश्यकता नहीं होनी चाहिए 2>&1 | grep -v "no crontab"क्योंकि जब कोई कॉन्टैब नहीं होता है, तो आउटपुट लाइन crontab: no crontab for...को स्टॉडर पर भेजा जाता है। उस आउटपुट को कैप्चर करने का कोई कारण नहीं है, इसे stdout को भेजें, और फिर इसे grep का उपयोग करके फ़िल्टर करें। यदि आपका लक्ष्य crontab: no crontab for...अपने आउटपुट में देखने से बचना है , तो उपयोग करें 2> /dev/null | sort....
मैट

6

यदि आप इसे केवल एक बार कुछ करने के लिए रन-वे परिदृश्य के लिए करने की योजना बना रहे हैं, तो 'at' पर एक नज़र डालें



5

यह मानते हुए कि आपके क्रॉस्टैब में पहले से ही एक प्रविष्टि है, निम्नलिखित कमांड को अपेक्षाकृत अच्छी तरह से काम करना चाहिए। ध्यान दें कि $CMDचर केवल पठनीयता के लिए है। डुप्लिकेट को फ़िल्टर करने से पहले सॉर्ट करना महत्वपूर्ण है, क्योंकि uniqकेवल आसन्न लाइनों पर काम करता है।

CMD='wget -O - -q http://www.example.com/cron.php"'
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -

यदि आपके पास वर्तमान में एक खाली क्रेबट है, तो आपको stderr को निम्न त्रुटि प्राप्त होगी:

no crontab for user

यदि आप इससे बचना चाहते हैं, तो आप थोड़ी जटिलता जोड़ सकते हैं, ऐसा कुछ जोड़ें:

(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//"  | sort | uniq | crontab -

5

यहाँ अधिकांश समाधान क्रॉस्टैब में लाइनें जोड़ने के लिए हैं। यदि आपको अधिक नियंत्रण की आवश्यकता है, तो आप कॉन्टैब की संपूर्ण सामग्री को नियंत्रित करने में सक्षम होना चाहते हैं।

आप सुंदर ढंग से ऐसा करने के लिए पाइपिंग का उपयोग कर सकते हैं।

Crontab को पूरी तरह से फिर से लिखना, करना

echo "2 2 2 2 2 /bin/echo foobar" |crontab -

यहाँ वर्णित अन्य उत्तरों के साथ संयोजन करना आसान होना चाहिए

crontab -l | <something> | tee |crontab -

या, यदि आपके पास फ़ाइल में सामग्री है, तो यह और भी सरल है

cat <file> |crontab -

3

यहाँ एक और लाइनर तरीका है, जो डुप्लिकेट से बचा जाता है

(crontab -l 2>/dev/null | fgrep -v "*/1 *  *  *  * your_command"; echo "*/1 *  *  *  * your_command") | crontab -

और यहां जॉनज़ का उत्तर देने और no crontab for userसंदेश से बचने का एक तरीका है , या यदि आपको एक set -euप्रकार के वातावरण में काम करने की आवश्यकता है और इसमें कुछ भी विफलता नहीं हो सकती है (जिस स्थिति में 2>/dev/nullभाग वैकल्पिक है):

( (crontab -l 2>/dev/null || echo "")  ; echo "0 * * * * your_command") | sort -u - | crontab -

या यदि आप चीजों को विभाजित करना चाहते हैं ताकि वे अधिक पठनीय हों:

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -

या वैकल्पिक रूप से your_command के लिए किसी भी संदर्भ को हटा दें (उदा: यदि शेड्यूल बदल गया है, तो आप केवल यह चाहते हैं कि यह कभी भी क्रोन किया जाए)। इस मामले में हमें अब कोई ज़रूरत नहीं है uniq(अतिरिक्त बोनस, सम्मिलन आदेश भी संरक्षित है):

new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -

2

आदमी crontab भी उपयोगी है:

Crontab (1)

नाम

   crontab - manipulate per-user crontabs (Dillon's Cron)

SYNOPSIS

   crontab file [-u user] - replace crontab from file

   crontab - [-u user] - replace crontab from stdin

   crontab -l [user] - list crontab for user

3
वह हिस्सा जो कहता है "
स्टड से क्रैस्टब को

2

जॉनज़ के उत्तर में जोड़ते हुए, यदि आप एक सुडौल हैं, तो रूट के रूप में शेड्यूल करने के लिए वाक्यविन्यास है:

(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -

1
function cronjob_exists($command){

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab)){

        $crontab = array_flip($crontab);

        if(isset($crontab[$command])){

            $cronjob_exists=true;

        }

    }
    return $cronjob_exists;
}

function append_cronjob($command){

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    }

    return $output;
}

    append_cronjob('* * * * * curl -s http://localhost/cron/test.php');

1

यह सुनिश्चित करने के लिए जाँच करेगा कि आपके आदेश को जोड़ने से पहले ही मौजूद नहीं है।

crontab -l 2>/dev/null | grep -q '/path/to/script' || echo "5 * * * * /path/to/script" | crontab -

चीयर्स।


0

Piping stdout में crontabmacOS पर मेरे लिए नया crontab स्थापित नहीं किया था, इसलिए मुझे इसके बजाय इसका समाधान मिला, teeउप शेल में संपादक का उपयोग करना :

(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)

0

यदि आप कार्य को एक उपयोगकर्ता के रूप में चलाना चाहते हैं:

crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | crontab -

यदि आप कार्य विशेषाधिकारों के साथ चलाना चाहते हैं:

sudo crontab -l | { cat; echo "@weekly what_you_want_to_execute"; } | sudo crontab -

और जांच कार्य ('sudo' के साथ या उसके बिना):

crontab -l | sed '/^$/d; /#/d'

-1

साथ ही आप अपने कार्यों को /etc/cron.*_ पर जोड़ सकते हैं


-2

आप क्रोन टेबल टेक्स्ट फ़ाइल को सीधे संपादित भी कर सकते हैं, लेकिन आपका समाधान पूरी तरह स्वीकार्य है।


1
फाइल भ्रष्टाचार की वजह से समवर्ती संपादन के अवसरों की चिंताओं के कारण मैं इसका लाभ उठाऊंगा। कमांड-लाइन crontab कमांड का उपयोग करके उस समस्या से बचना चाहिए।
क्रेग एस

क्रेग, अधिक शोध के बिना मुझे यकीन नहीं होगा कि कमांड लाइन संस्करण परमाणु और नस्ल-स्थिति-सुरक्षित है। शायद "काफी सुरक्षित" वैसे भी।
13 दिसंबर को tuomassalo

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