हर महीने के पहले सोमवार को क्रॉन जॉब चलाएं?


32

मैं हर महीने के पहले सोमवार को 8.30 बजे क्रोन से नौकरी चलाना चाहता हूं। क्रोन विकिपीडिया पृष्ठ कहता है

जबकि आम तौर पर नौकरी तब निष्पादित की जाती है जब समय / तिथि विनिर्देश फ़ील्ड सभी वर्तमान समय और दिनांक से मेल खाते हैं, एक अपवाद है: यदि दोनों "महीने का दिन" और "सप्ताह का दिन" प्रतिबंधित हैं ("*" नहीं), तो या तो "महीने का दिन" फ़ील्ड (3) या "सप्ताह का दिन" फ़ील्ड (5) वर्तमान दिन से मेल खाना चाहिए।

(मेरा जोर)

क्या इसका मतलब है कि मैं महीने का पहला सोमवार नहीं कर सकता, मैं केवल महीने का पहला (या जो भी) कर सकता हूं? मैं इसे गोल करने के तरीके के बारे में नहीं सोच सकता।


slhck - जो एक अच्छे समाधान की तरह लगता है - क्या आप पूर्ण कोड के साथ उत्तर में इसका विस्तार करने का मन करेंगे? तो मैं इसे सही के रूप में चिह्नित करूंगा :)
मैक्स विलियम्स

जवाबों:


39

आप शर्त को वास्तविक क्रॉस्टैब कमांड में डाल सकते हैं:

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

अब, यदि यह स्थिति महीने में पहले सात दिनों में से एक पर सच है, तो आपके पास इसका पहला सोमवार है। ध्यान दें कि क्रैस्टैब में, प्रतिशत-सिंटैक्स को हालांकि बचना होगा:

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

echoउस वास्तविक कमांड के साथ कमांड को बदलें जिसे आप चलाना चाहते हैं। मुझे एक समान दृष्टिकोण भी मिला ।


वास्तव में, slhck, मैं भी जल्द ही बात की - यह मेरे crontab में काम नहीं कर रहा है: यह किसी कारण से तारीख परीक्षण के साथ एक समस्या है लगता है। यह कमांड लाइन [ "$(date '+%a')" = "Mon" ] && echo "It's Monday"में काम करता है [ $(date '+%a') = "Mon" ] && echo "It's Monday" , लेकिन कॉटैब में, यह इस परीक्षण में विफल हो रहा है। मुझे क्रोन से किसी भी उपयोगी प्रतिक्रिया पर नहीं मिल सकता है: मैं [ "$(date '+%a')" = "Tue" ] >> /home/deploy/cron.log 2>&1एक लॉग में किसी भी त्रुटि आउटपुट को पकड़ने के लिए यह कोशिश कर रहा हूं, लेकिन यह भी काम नहीं कर रहा है: /
मैक्स विलियम्स

हम्म। क्या आप जांच सकते हैं कि dateआउटपुट सही है या नहीं? उदाहरण के लिए, बस एक cronकमांड को चलाने दें जो इसे एक फाइल में आउटपुट करता है: date '+%a' > ~/datetest 2>&1- फिर जांच करें कि क्या इसके खिलाफ तुलना करने के लिए सही स्ट्रिंग का परिणाम है।
slhck

1
मैंने समस्या को पाया - +%aभागने में प्रतिशत की आवश्यकता जब वह क्रॉस्टैब में था, अर्थात लाइन को यह होना चाहिए [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday":। यदि आप अपने उत्तर को अपडेट कर सकते हैं तो यह भविष्य के पाठकों के लिए उपयोगी होगा :) धन्यवाद फिर से - अधिकतम
अधिकतम विलियम्स

ओह, अब मैं क्यों देखता हूं। खुशी है कि यह अब काम करता है, इसे आज़माने के लिए धन्यवाद!
slhck

15

मेरे पास स्पैनिश पर लोकल के साथ एक कंप्यूटर है, इसलिए, यह दृष्टिकोण मेरे लिए काम नहीं कर रहा है क्योंकि मोन लुन में बदलता है

अन्य भाषाएं भी विफल हो जाएंगी, इसलिए, मैंने भाषा के अवरोध को स्वीकार करने वाले स्वीकृत उत्तर पर थोड़ा बदलाव किया:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

+1 ¡मुई बिएन, सीन!
जेकॉल्ड

1
ग्रेसिया v पुरा विदा! ; घ
कमनक्र

यह स्वीकृत उत्तर होना चाहिए। मेरे पास एक डच लोकेल है जो सप्ताह के दिनों के लिए अलग-अलग नामों का उपयोग करता है। और संख्याओं का उपयोग करके सप्ताह के दिन को निर्धारित करने के लिए तार की तुलना में क्लीनर भी महसूस होता है।
0ne_Up

7

मुझे यह आसान लगता है जब दिन की संख्या को संभालने की कोई आवश्यकता नहीं होती है।

महीने का पहला सोमवार चलाएं:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

अर्थात यदि 1 सप्ताह पहले का महीना चालू माह के समान नहीं है तो हम महीने के 1 दिन (= सोमवार) को होते हैं।

इसी तरह, तीसरे शुक्रवार के लिए

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

यानी यदि 3 सप्ताह पहले का महीना वर्तमान महीने से अलग है तो हम महीने के 3 दिन 6 (= शुक्रवार) हैं


सप्ताह का 6 दिन शनिवार है शुक्रवार नहीं।
रॉबर्ट

4

मैंने हर महीने के 4 सोमवार को शाम 4:00 बजे चलने के लिए एक नौकरी निर्धारित की है:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

1

जहां तक ​​मुझे पता है कि केवल क्रॉस्टैब का उपयोग करना संभव नहीं है, हालांकि एक "महीने के पहले सात दिनों" के कबाब प्रविष्टि से सही दिन चुनने के लिए एक आवरण फ़ंक्शन का उपयोग कर सकते हैं; इसे प्रविष्टि से देखें ।

रैपर स्क्रिप्ट होगी

#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
   exec somecommand
fi
exit 1

और आपको इसे चलाने की आवश्यकता होगी (यह मानते हुए कि इसे रैपर.श और वैश्विक रूप से उपलब्ध कहा जाता है) को क्रॉस्टैब प्रविष्टि का उपयोग करके

0 0 * * 1 wrapper.sh

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

1

सोलारिस 10 पर मुझे इस स्थिति को प्रारूपित करना था:

[ `date +\%a` = "Sat" ] && echo "It's Saturday"

1

आप महीने के पहले सात दिनों के लिए क्रोनजोब चलाने की कोशिश कर सकते हैं और इसे सोमवार को ही निष्पादित कर सकते हैं।

30 8 * * 1 [`date +\%d` -le 07] && <job>

ऊपर आपको काम करना चाहिए।


+1 अधिक सफलता हिट राशन तो पहले सप्ताह के लिए चलाने के लिए और सोमवार के लिए जाँच करें। :-)
xmedeko

1

मैं उपयोग करने की सलाह देता हूं

"$(/bin/date '+%\w')" = "1"

के बजाय

"$(date '+\%a')" = "Mon"

स्थानीय समस्या से बचने के लिए।


0

मैंने इस तरह की समस्याओं के लिए एक सामान्य समाधान किया, यह महीने के पहले, दूसरे, तीसरे ..... आखिरी सप्ताह के दिनों के लिए काम करता है।

आप इसे इस तरह से उपयोग कर सकते हैं:

30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"

स्क्रिप्ट रन-इफ-टुडे आज के कार्यदिवस और वांछित सप्ताह की तिथि सीमा दोनों के लिए जाँच करें, यदि दोनों मेल खाते हैं तो यह 0, अन्यथा 1 रिटर्न देता है।

यहां कोड चेक करें। https://github.com/xr09/cron-last-sunday


0

मेरा मानना ​​है कि यह समस्या को और अधिक सुरुचिपूर्ण ढंग से हल करता है:

30 8 1-7 * 1 /run/your/job.sh

1
रवींद्र! : "यदि दोनों फ़ील्ड प्रतिबंधित हैं (यानी, * नहीं हैं), तो कमांड तब चलाया जाएगा जब या तो फ़ील्ड वर्तमान समय से मेल खाती है।"
सिम्बियन

फरवरी को (जो 28 वें को समाप्त होता है) इसे हर 4 साल में नहीं चलाया जाएगा।
इगाक्रैच

"या तो" का अर्थ है उनमें से कोई भी, "दोनों" नहीं। यह महीने के पहले 7 दिनों तक हर दिन चलेगा।
माइनसफ

यह पंक्ति प्रत्येक माह के पहले से सातवें दिन, साथ ही प्रत्येक सोमवार को एक कमांड चलाती है
टॉमस जकब रूप

0

चूंकि मैं php और js का उपयोग करके अपने क्रॉन स्टेटमेंट की व्याख्या करता हूं, इसलिए मैं बैश का उपयोग नहीं कर सकता। अंत में मैंने पाया कि यह है बस क्रॉन के साथ संभव वास्तव में:

0 30 8 * 1/1 MON#1

मनाइए कि यह किसी और के लिए सहायक हो। भले ही, मैं आप सभी के सुंदर दिन की कामना करता हूं। :-)


यह क्रोन नहीं है, यह संभवतः क्वार्ट्ज है
सिवान

-1
0 9 1-7 * 1 * 

यह हर महीने के हर सोमवार को काम करेगा।


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