मैं एक स्क्रिप्ट के माध्यम से कैसेट बना सकता हूं


153

मुझे सर्वर सेट करने के लिए चलाए जाने वाले स्क्रिप्ट के साथ क्रोन जॉब जोड़ने की आवश्यकता है। मैं वर्तमान में उबंटू का उपयोग कर रहा हूं। मैं उपयोग कर सकता हूं, crontab -eलेकिन यह वर्तमान क्रेटाब को संपादित करने के लिए एक संपादक खोल देगा। मैं यह प्रोग्रामेटिक रूप से करना चाहता हूं।

क्या ऐसा करना संभव है?




यदि आप एक क्रॉस्टैब प्रविष्टि को संशोधित या हटाना चाहते हैं, तो नीचे मेरा समाधान देखें।
ब्रायन स्मिथ

जवाबों:


11

क्रोन नौकरियों को आमतौर पर प्रति-उपयोगकर्ता फ़ाइल में संग्रहीत किया जाता है /var/spool/cron

आपके लिए सबसे सरल बात यह है कि शायद कॉन्फ़िगर की गई नौकरी के साथ एक पाठ फ़ाइल बनाएं, फिर इसे क्रोन स्पूल फ़ोल्डर में कॉपी करें और सुनिश्चित करें कि इसकी सही अनुमतियाँ (600) हैं।


20
फ़ाइलों को सीधे / var / स्पूल / क्रोन में संशोधित करके उन पर रखा जाता है। वास्तव में, यदि आप वहां फाइलों को देखते हैं, तो वे आम तौर पर पहले पंक्ति के रूप में "DO NOT EDIT THIS FILE" जैसे चेतावनी शामिल होंगे।
जारेड

12
@Jared जबकि मैं विचार से काफी सहमत हूं, यह कहते हुए कि "बहुत मदद नहीं करता है"। बल्कि यह बताएं कि कौन सी अन्य फाइल को संपादित किया जाना चाहिए, यदि कोई हो, या मैन्युअल रूप से फाइलों को संपादित करने के जोखिमों की व्याख्या करें। मैं स्वचालित कमांड लाइन के माध्यम से कुछ क्रॉन जॉब्स बनाने की योजना बना रहा हूं, और यदि इस फाइल को संपादित करना एकमात्र विकल्प है, और महत्वपूर्ण दुष्प्रभावों के बिना, मैं यह नहीं देखता कि मुझे इसका उपयोग क्यों नहीं करना चाहिए।
बालमीपुर

47
असली उत्तर के लिए नीचे स्क्रॉल करें।
जॉन रेड

1
मेरी राय में, यह उत्तर बेहतर है: stackoverflow.com/a/610860/2681752
गालाक्स

2
मैंने इस दृष्टिकोण को लिया और पछतावा किया। RHEL पर, निर्देशिका / var / spool / cron विश्व निष्पादन योग्य नहीं है, इसलिए उपयोगकर्ता निर्देशिका को पीछे नहीं कर सकते हैं और अपनी फ़ाइलों को मैन्युअल रूप से संपादित नहीं कर सकते हैं। यदि आप / var / spool / cron world को निष्पादन योग्य बनाते हैं, तो आपका मित्रवत स्थानीय sysadmin आप पर पागल हो जाएगा, साथ ही cronie पैकेज को कभी भी पुनर्स्थापित या अपडेट किए जाने पर अनुमति परिवर्तन को अधिलेखित किया जा सकता है।
functionvoid

384

यहां एक लाइनर का उपयोग किया गया है जो फ़ाइल में होने के लिए नए कार्य का उपयोग / आवश्यकता नहीं करता है:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

यह 2>/dev/nullमहत्वपूर्ण है ताकि आपको यह no crontab for usernameसंदेश न मिले कि कुछ * निक्स का उत्पादन होता है यदि वर्तमान में कोई कॉन्टैब प्रविष्टियां नहीं हैं।


14
यह स्वीकृत उत्तर होना चाहिए। बस एक तरह से अब यह जांचने की ज़रूरत है कि मैं जिस वन-लाइनर को जोड़ने का इरादा रखता हूं, वह पहले से ही है या नहीं ...
ChrisPrime

7
... ओह रुको, यहाँ कैसे
जांचा जाए

1
यदि इस स्क्रिप्ट को एक कमांड के रूप में दोहराया जाए और मौजूदा क्रोन कार्य को संशोधित किया जाए, तो मौजूदा लाइन को क्रॉस्टैब में बदलना अच्छा हो सकता है। कई मार्करों को विभिन्न क्रोन कार्यों (नियंत्रण-मार्कर -1, नियंत्रण-मार्कर -2, आदि ...) को नियंत्रित करने के लिए इस्तेमाल किया जा सकता है: (crontab -l 2> / dev / null | grep -v control-मार्कर -1; गूंज '* / 5 * * * * / पाथ / टू / जॉब -साथ में # कंट्रोल-मार्कर -1') | crontab -
शेफ

7
मैंने पाया कि यह मौजूदा क्रॉस्टैब प्रविष्टियों को हटा रहा था और मुझे एक अलग उपयोगकर्ता (रूट) का उपयोग करने की आवश्यकता थी, इसलिए मैंने मौजूदा प्रविष्टियों को बनाए रखने के लिए निम्नलिखित का उपयोग किया: echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -उम्मीद है कि यह किसी की मदद करता है
डैनी

60

उपयोगकर्ता crontabs (रूट सहित) के लिए, आप कुछ ऐसा कर सकते हैं:

crontab -l -u user | cat - filename | crontab -u user -

जहां फ़ाइल नाम "फ़ाइल नाम" में आइटम शामिल हैं। आप पाठ हेरफेर भी कर सकते हैं sedया इसके स्थान पर किसी अन्य उपकरण का उपयोग कर सकते हैं cat। आपको crontabफ़ाइल को सीधे संशोधित करने के बजाय कमांड का उपयोग करना चाहिए ।

एक समान ऑपरेशन होगा:

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

यदि आप सिस्टम क्रॉन्बस को संशोधित या बना रहे हैं, तो उन में हेरफेर किया जा सकता है जैसा कि आप साधारण पाठ फ़ाइलों के रूप में करेंगे। वे में जमा हो जाती /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthlyनिर्देशिका और फाइल में /etc/crontabऔर /etc/anacrontab


होनहार लग रहा है लेकिन दूसरे दृष्टिकोण की कोशिश कर रहा है (के साथ echo), मुझे "crontab: उपयोग त्रुटि: फ़ाइल नाम को प्रतिस्थापित करने के लिए निर्दिष्ट करना चाहिए।" क्रोन मैन पेज crontab [ -u user ] fileएक अनिवार्य फ़ाइल नाम के साथ, सिंटैक्स दिखाता है। क्या इसके बजाय पाइप किए गए डेटा को स्वीकार करने के लिए कुछ चाल है?
मार्क बेरी

1
@ मार्केबेरी: इसके बारे में क्षमा करें। एक पाइप में, एक हाइफ़न का उपयोग यह इंगित करने के लिए किया जाना चाहिए कि इनपुट कहां से है stdin। मैं अपना उत्तर सही करूंगा।
अगली सूचना तक रोक दिया गया।

29

उबंटू और कई अन्य डिस्ट्रोस में, आप केवल एक फाइल को एक /etc/cron.dनिर्देशिका में डाल सकते हैं जिसमें एक वैध क्रॉस्टेब प्रविष्टि के साथ एक ही लाइन है । मौजूदा फ़ाइल में लाइन जोड़ने की आवश्यकता नहीं है।

यदि आपको दैनिक चलाने के लिए कुछ चाहिए, तो बस एक फ़ाइल डालें /etc/cron.daily। इसी तरह, आप भी में फ़ाइलों को छोड़ सकते हैं /etc/cron.hourly, /etc/cron.monthlyऔर /etc/cron.weekly


5
लेकिन आपको ऐसा करने के लिए रूट होना चाहिए।
कीथ

17

आपके प्रश्न का और भी सरल उत्तर होगा:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

आप नीचे के रूप में दूरस्थ सर्वर पर क्रोनोजर सेटअप कर सकते हैं:

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

लिनक्स में, crontabफ़ाइल का डिफ़ॉल्ट स्थान है /var/spool/cron/। यहां आप crontabसभी उपयोगकर्ताओं की फाइलें पा सकते हैं । आपको बस अपनी क्रोनजोब प्रविष्टि को संबंधित उपयोगकर्ता की फ़ाइल में संलग्न करना होगा। उपरोक्त उदाहरण में, रूट उपयोगकर्ता की क्रॉस्टैब फ़ाइल को क्रोनजोब के साथ /root/test.shहर दिन 1 बजे चलाने के लिए जोड़ा जा रहा है।


वह /var/spool/cron/crontabs/rootउबंटू पर होगा ।
.होर मैं

17

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

crontab [path to file]एक फ़ाइल में संग्रहीत crontab निर्दिष्ट करने के लिए इस्तेमाल किया जा सकता है। जैसे crontab -e, यह केवल फ़ाइल को स्थापित करेगा यदि यह त्रुटि मुक्त है।

इसलिए, एक स्क्रिप्ट या तो सीधे क्रोन टैब फ़ाइलों को लिख सकती है, या उन्हें एक अस्थायी फ़ाइल में लिख सकती है और उन्हें crontab [path to temp file]कमांड के साथ लोड कर सकती है । लिखने से सीधे एक अस्थायी फ़ाइल लिखने की बचत होती है, लेकिन यह सुरक्षा जांच से भी बचती है।


2
अपने जैसे नोक के लिए, ध्यान दें कि यह है crontab [path to file].. यह निश्चित रूप से मेरे लिए सबसे अच्छा विकल्प था, क्योंकि यह अधिक सुपाठ्य कोड की अनुमति देता है। मैं पार्सल को ट्रैक करने और स्थिति के साथ अपने डेस्कटॉप वॉलपेपर को बदलने के लिए क्रॉस्टैब का उपयोग करता हूं। जब मैं पार्सल की उम्मीद नहीं कर रहा हूं, तो इसे हर घंटे जांचने की जरूरत नहीं है। यही कारण है कि मैं स्क्रिप्ट को क्रोन आवृत्ति को ऑटो-एडिट करना चाहता था।
रासमस

1
@ रासुस एक भयानक स्क्रिप्ट की तरह लगता है कि मैं चोरी करने में सक्षम होना पसंद करूंगा। एक जिस्ट या इसी तरह के माध्यम से साझा करने का कोई भी मौका?
क्लेडोक्स

8

(मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं एक उत्तर के रूप में जोड़ रहा हूं: अपने उत्तर के रूप में टिप्पणी के रूप में इसे जोड़ने के लिए स्वतंत्र महसूस करें)

जो कैसडोनेट का वन-लाइनर एकदम सही है, सिवाय इसके कि अगर आप साथ चलते हैं set -e, यानी यदि आपकी स्क्रिप्ट त्रुटि पर विफल है, और अगर कोई क्रोनॉजर अभी तक नहीं है। उस स्थिति में, वन-लाइनर क्रोनजॉब नहीं बनाएगा, लेकिन स्क्रिप्ट को बंद नहीं करेगा। मूक विफलता बहुत भ्रामक हो सकती है।

कारण यह है कि crontab -lरिटर्न 1कोड के साथ रिटर्न होता है , जिससे बाद की कमांड ( ए echo) निष्पादित नहीं होती है ... इस प्रकार क्रोनजोब नहीं बनाया जाता है। लेकिन जब से उन्हें एक उपप्रकार के रूप में निष्पादित किया जाता है (क्योंकि कोष्ठक के कारण) वे स्क्रिप्ट को रोकते नहीं हैं।

(दिलचस्प है, यदि आप एक ही आदेश को फिर से चलाने के लिए, यह काम करेगा: एक बार आप निष्पादित crontab -एक बार, crontab -lअभी भी आउटपुट कुछ भी नहीं है, लेकिन यह एक त्रुटि अब और वापस नहीं करता है (यदि आप नहीं मिलता no crontab for <user>संदेश अब और) तो बाद में। echoक्रियान्वित किया जाता है और क्रेस्टब बनाया गया है)

किसी भी स्थिति में, यदि आप साथ चलते हैं set -e, तो लाइन होनी चाहिए:

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -

हाँ, यह और भी सही है।
यंगवे स्नेन लिंडल

7

सुझाव देने वालों के लिए एक सुधार के रूप में crontab -l | crontab -: यह हर प्रणाली पर काम नहीं करता है। उदाहरण के लिए, मुझे एक पुराने संस्करण SUSE (नहीं पूछें क्यों) को चलाने वाले दर्जनों सर्वरों पर रूट क्रॉस्टैब पर नौकरी जोड़ना पड़ा। पुरानी SUSEs के उत्पादन के लिए टिप्पणी लाइनें प्रस्तुत करता है crontab -l, crontab -l | crontab -गैर- बेरोजगार बना (डेबियन crontab मैनपेज में इस समस्या को पहचानता है और डिफ़ॉल्ट व्यवहार को बदलने के लिए विक्सी क्रोन के अपने संस्करण को पैच किया है crontab -l)।

उन सिस्टम पर प्रोग्रामेटिक रूप से संपादित करने के लिए जहां crontab -lटिप्पणियां जोड़ता है, आप निम्नलिखित की कोशिश कर सकते हैं:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=catcatएक संपादक के रूप में उपयोग करने के लिए कॉन्टैब को बताता है (सामान्य डिफ़ॉल्ट vi नहीं), जो फ़ाइल को नहीं बदलता है, बल्कि इसे stdout में कॉपी करता है। यदि आउटपुट crontab -से भिन्न प्रारूप में इनपुट की अपेक्षा है तो यह अभी भी विफल हो सकता है crontab -e। अंतिम बदलने के लिए कोशिश मत करो crontab -के साथ crontab -e- यह काम नहीं करेगा।


4

अच्छी तरह से /etc/crontabसिर्फ एक ascii फ़ाइल तो बस सबसे सरल है

 echo "*/15 * * * *   root     date" >> /etc/crontab

जो एक नौकरी जोड़ देगा जो आपको हर 15 मिनट में ईमेल करेगा। स्वाद के साथ समायोजित करें, और grepअन्य माध्यमों से परीक्षण करें कि क्या लाइन पहले से ही आपकी स्क्रिप्ट को सुस्पष्ट बनाने के लिए जोड़ी गई थी।

उबंटू एट अल पर, आप उन फ़ाइलों को भी छोड़ सकते हैं /etc/cron.*जो करना आसान है और परीक्षण करना है --- इसके अलावा आप (सिस्टम) कॉन्फ़िगर फ़ाइलों के साथ गड़बड़ न करें जैसे कि /etc/crontab


1
मुझे लगता है कि तकनीकी तौर पर क्रोनब को बदलावों की निगरानी करने की आवश्यकता नहीं है, भले ही वास्तविकता में अधिकांश कार्यान्वयन हो, इसलिए मैं कॉस्ट्रैब को कॉल करने की सिफारिश करूंगा-बाद में इसे ठेस पहुंचाऊंगा। crontab -e, EDITOR वैरिएबल का सम्मान करता है यदि मेमोरी काम करती है, तो इसे / बिन / सच के लिए सेट करने के लिए बस कॉन्टैब को फिर से पढ़ने के लिए मजबूर करना चाहिए।
उलरिच श्वार्ज

1
यह सच है अभी तक किसी भी हाल Linux सिस्टम पर crond करता है पर नजर रखने के लिए, और यह निश्चित रूप से ओ पी के घोषित मंच पर करता है।
डिर्क एडल्डबुलेटेल

यदि आप रूट हैं और स्क्रिप्ट को रूट के रूप में चलाना चाहते हैं। ओपी के मामले में यह वांछनीय नहीं हो सकता है।
कीथ

ऐसा नहीं है, मेरे पास / etc / crontab में बहुत सारी गैर-रूट प्रविष्टियाँ हैं। फ़ाइल में संलग्न करने के लिए आपको 'केवल' सूडो की आवश्यकता होती है। वैसे भी, जैसा कि मैंने कहा, वहाँ भी /etc/cron.*/ है, लेकिन आपको वहाँ लिखने के लिए भी मूल होने की आवश्यकता है।
डिर्क एडल्डबुलेटेल

2

यहाँ क्रोन फ़ाइल को सीधे संपादित किए बिना एक प्रविष्टि को क्रोन में कैसे संशोधित किया जाए (जो कि उस पर लिखा है)।

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

यदि आप क्रोन प्रविष्टि को हटाना चाहते हैं, तो इसका उपयोग करें:

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

मुझे एहसास है कि गौरव यह नहीं पूछ रहा था, लेकिन सभी समाधान एक जगह क्यों नहीं थे?


1

मैंने अजगर में एक क्रॉस्टैब तैनाती उपकरण लिखा है: https://github.com/monklof/deploycron

pip install deploycron

अपने क्रॉस्टैब को स्थापित करना बहुत आसान है, यह क्रॉस्टैब को सिस्टम के मौजूदा क्रॉस्टैब में मर्ज कर देगा।

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")

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