AWS इलास्टिक बीनस्टॉक, एक क्रोनजोब चल रहा है


89

मैं जानना चाहूंगा कि क्या क्रोनजॉब / टास्क को सेट करने का कोई तरीका है, जो हर मिनट निष्पादित होता है। वर्तमान में मेरा कोई भी उदाहरण इस कार्य को चलाने में सक्षम होना चाहिए।

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

container_commands:
  01cronjobs:
    command: echo "*/1 * * * * root php /etc/httpd/myscript.php"

अगर यह करने का सही तरीका है तो मुझे यकीन नहीं है

कोई विचार?


1
क्या आज्ञा सही है? मेरा मतलब है ... यह हो सकता है: कमांड: इको "* / 1 * * * * रूट php /etc/httpd/myscript.php"> /etc/cron.d/something किसी भी तरह से, मैं आपको यह उपयोग करने का सुझाव दूंगा leader_only ध्वज, अन्यथा सभी मशीनें एक ही बार में इस क्रॉन की नौकरी को आग
देंगी

हाँ! निश्चित रूप से leader_only ध्वज का उपयोग करते हुए, मैं कमांड बदलने की कोशिश करूँगा।
ओनिमा

जवाबों:


97

इस तरह से मैंने इलास्टिक बीनस्टॉक में एक क्रॉन जॉब जोड़ा:

यदि आपके पास पहले से मौजूद नहीं है, तो .extxtension नामक रूट पर एक फ़ोल्डर बनाएँ। फिर .extxtensions फ़ोल्डर के अंदर एक कॉन्फ़िगर फ़ाइल बनाएं। मैं उदाहरण के लिए उपयोग करूंगा। उदाहरण के लिए उदाहरण के लिए। फिर इसे example.config में जोड़ें

container_commands:
  01_some_cron_job:
    command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
    leader_only: true

यह इलास्टिक बीनस्टॉक के लिए एक YAML कॉन्फ़िगरेशन फ़ाइल है। जब आप इसे अपने टेक्स्ट एडिटर में कॉपी करते हैं तो सुनिश्चित करें कि आपका टेक्स्ट एडिटर टैब के बजाय स्पेस का उपयोग करता है। अन्यथा आप EB को पुश करने पर एक YAML त्रुटि प्राप्त करेंगे।

तो यह जो करता है वह 01_some_cron_job नामक एक कमांड बनाता है। कमांड वर्णमाला क्रम में चलाए जाते हैं, इसलिए 01 यह सुनिश्चित करता है कि यह पहली कमांड के रूप में चलाया जाए।

कमांड तब एक फाइल की सामग्री लेता है जिसे some_cron_job.txt कहा जाता है और इसे /etc/cron.d में some_cron_job नामक फ़ाइल में जोड़ देता है।

कमांड तब /etc/cron.d/some_cron_job फ़ाइल पर अनुमतियाँ बदलता है।

Leader_only कुंजी सुनिश्चित करती है कि कमांड केवल ec2 उदाहरण पर चलाया जाता है जिसे नेता माना जाता है। आपके द्वारा चलाए जा रहे प्रत्येक Ec2 उदाहरण पर चलने के बजाय।

फिर .ebextensions फ़ोल्डर के अंदर some_cron_job.txt नामक एक फ़ाइल बनाएं। आप इस फाइल में अपनी क्रॉन जॉब्स लगाएंगे।

उदाहरण के लिए:

# The newline at the end of this file is extremely important.  Cron won't run without it.
* * * * * root /usr/bin/php some-php-script-here > /dev/null

तो यह क्रॉन जॉब रूट उपयोगकर्ता के रूप में हर दिन के हर घंटे के हर मिनट चलेगा और आउटपुट को / dev / null पर छोड़ देगा। / usr / bin / php php का मार्ग है। फिर कुछ php-script-here को अपनी php फाइल के पथ के साथ बदलें। यह स्पष्ट रूप से माना जा रहा है कि आपकी क्रॉन जॉब के लिए PHP फ़ाइल को चलाने की आवश्यकता है।

इसके अलावा, सुनिश्चित करें कि some_cron_job.txt फ़ाइल में फ़ाइल के अंत में एक नई पंक्ति है जैसे टिप्पणी कहती है। अन्यथा क्रोन नहीं चलेगा।

अद्यतन: इस समाधान के साथ एक समस्या है जब इलास्टिक बीनस्टॉक आपके उदाहरणों को मापता है। उदाहरण के लिए, यह बताता है कि आपके पास क्रोन जॉब के साथ एक उदाहरण है। आपको ट्रैफ़िक में वृद्धि मिलती है इसलिए इलास्टिक बीनस्टॉक आपको दो उदाहरणों तक पहुंचाता है। लीडर_ओनली यह सुनिश्चित करेगा कि आपके पास केवल दो उदाहरणों के बीच एक क्रॉन जॉब चल रही है। आपका ट्रैफ़िक कम हो जाता है और इलास्टिक बीनस्टॉक आपको एक उदाहरण के लिए नीचे ले जाता है। लेकिन दूसरा उदाहरण समाप्त करने के बजाय, इलास्टिक बीनस्टॉक ने पहले उदाहरण को समाप्त कर दिया जो नेता था। अब आपके पास कोई क्रॉन जॉब नहीं है क्योंकि वे केवल पहले उदाहरण पर चल रहे थे जिन्हें समाप्त कर दिया गया था। नीचे टिप्पणी देखें।

अद्यतन 2: बस नीचे दी गई टिप्पणियों से यह स्पष्ट कर रहा है: AWS को अब स्वचालित आवृत्ति समाप्ति से सुरक्षा मिली है। बस इसे अपने लीडर इंस्टेंस पर सक्षम करें और आप जाने के लिए अच्छे हैं। - निकोलस एरेवलो अक्टूबर 28 '16 को 9:23 पर


12
मैं कुछ समय के लिए आपके सुझाव का उपयोग कर रहा हूं, और हाल ही में एक मुद्दे पर भाग गया, जहां किसी तरह नेता ने स्विच किया, जिसके परिणामस्वरूप कई उदाहरण क्रोन चल रहे थे। उस समस्या को हल करने के लिए, मैं बदल 01_some_cron_jobगया 02_some_cron_jobऔर 01_remove_cron_jobsनिम्नलिखित के साथ जोड़ा गया command: "rm /etc/cron.d/cron_jobs || exit 0":। इस तरह, हर तैनाती के बाद केवल नेता के पास cron_jobsफाइल होगी । यदि नेता बदलते हैं, तो आप बस फिर से काम कर सकते हैं और क्रोन को बस एक बार फिर से चलाने के लिए तय किया जाएगा।
विलेम रेनजेमा

4
मैं leader_onlyसंपत्ति पर भरोसा करने के खिलाफ सुझाव दूंगा । यह केवल परिनियोजन के दौरान उपयोग किया जाता है और यदि आप नीचे या आपके "लीडर" उदाहरण को विफल कर देते हैं, तो आप संदर्भ के
arnaslu

2
यह मत करो। यह बहुत अविश्वसनीय है। मुझे काम करने का एकमात्र तरीका माइक्रो इंस्टेंस और CURL का उपयोग करके वहां से क्रॉन जॉब्स चलाना है। यह गारंटी देता है कि केवल एक उदाहरण इसे चलाता है और जो नेता क्रोन स्थापित करता है उसे समाप्त नहीं किया जाता है।
बेन सिंक्लेयर

1
मैंने एक छोटी रूबी स्क्रिप्ट के साथ इसे ठीक करने की कोशिश की, आप इसे यहाँ पा सकते हैं: github.com/SocialbitGmbH/AWSBeanstalkLeaderManager
थॉमस केकेन

8
AWS को अब स्वचालित आवृत्ति समाप्ति के विरुद्ध सुरक्षा मिली है। बस इसे अपने लीडर इंस्टेंस पर सक्षम करें और आप जाने के लिए अच्छे हैं।
निकोलस एरेवलो

58

यह अब ऐसा करने का आधिकारिक तरीका है (2015+)। कृपया इसे पहले आज़माएं, यह अभी तक उपलब्ध सबसे आसान विधि है और साथ ही सबसे विश्वसनीय भी है।

वर्तमान डॉक्स के अनुसार, कोई व्यक्ति अपने तथाकथित कर्मचारी स्तर पर आवधिक कार्यों को चलाने में सक्षम है

प्रलेखन का हवाला देते हुए:

AWS इलास्टिक बीनस्टॉक एक समाधान स्टैक के साथ पूर्वनिर्धारित कॉन्फ़िगरेशन चलाने वाले वातावरण में श्रमिक पर्यावरण के स्तरों के लिए आवधिक कार्यों का समर्थन करता है जिसमें कंटेनर नाम में "v1.2.0" होता है। आपको एक नया वातावरण बनाना होगा।

इसके अलावा दिलचस्प cron.yaml के बारे में हिस्सा है :

आवधिक कार्यों को लागू करने के लिए, आपके एप्लिकेशन स्रोत बंडल में रूट स्तर पर cron.yaml फ़ाइल शामिल होनी चाहिए। फ़ाइल में आपके द्वारा नियत किए जाने वाले आवधिक कार्यों के बारे में जानकारी होनी चाहिए। मानक crontab सिंटैक्स का उपयोग करके इस जानकारी को निर्दिष्ट करें।

अपडेट करें: हम यह काम पाने में सक्षम थे। हमारे अनुभव (Node.js प्लेटफ़ॉर्म) से कुछ महत्वपूर्ण गोत्र इस प्रकार हैं:

  • Cron.yaml फ़ाइल का उपयोग करते समय , सुनिश्चित करें कि आपके पास नवीनतम है awbbcli है , क्योंकि पुराने संस्करण ठीक से काम नहीं करेंगे।
  • यह नया वातावरण बनाने के लिए भी महत्वपूर्ण है (कम से कम हमारे मामले में यह था), न कि केवल पुराने को क्लोन करना।
  • यदि आप यह सुनिश्चित करना चाहते हैं कि CRON आपके EC2 वर्कर टियर उदाहरण पर समर्थित है, तो इसमें ssh ( eb ssh), और चलाएँ cat /var/log/aws-sqsd/default.log। इसे रिपोर्ट करना चाहिए aws-sqsd 2.0 (2015-02-18)। यदि आपके पास 2.0 संस्करण नहीं है, तो अपना वातावरण बनाते समय कुछ गलत हो गया है और आपको ऊपर बताए अनुसार नया बनाने की आवश्यकता है।

2
Cron.yaml के बारे में, एक बहुत बढ़िया ब्लॉग पोस्ट है: Amazon Web Services (AWS) Elastic Beanstalk पर चल रही क्रोन नौकरियां - मध्यम
jwako

5
इसके लिए धन्यवाद - धोखेबाज़ सवाल - मुझे कैलेंडर की आगामी घटनाओं के लिए घंटे में दो बार अपने वेब ऐप के डेटाबेस की जांच करने के लिए मेरे क्रोन की आवश्यकता है, और जब ऐसा होता है तो एक अनुस्मारक ईमेल भेजें। यहां सबसे अच्छा सेटअप क्या है, क्या मुझे अपने वेब ऐप पर मार्ग के लिए cron.yaml URL बिंदु होना चाहिए? या मुझे अपने कार्यकर्ता को डेटाबेस में एवी ऐप एक्सेस देना चाहिए? इस पर वहाँ थोड़ा बाहर!
क्रिस्टियन

5
@christian जिस तरह से हम इसे करते हैं, हमारे पास एक ही ऐप दो अलग-अलग वातावरणों में चल रहा है (इस प्रकार किसी विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं है) - कार्यकर्ता और सामान्य वेब सर्वर एक। वर्कर पर्यावरण के पास कुछ विशेष मार्ग होते हैं जो एक ईएनवी वैरिएबल सेट करके सक्षम होते हैं जिसे हमारा ऐप दिखता है। इस तरह, आप सामान्य ऐप के साथ साझा कोडबेस के लक्जरी होने के दौरान, अपने cron.yaml में विशेष कार्यकर्ता-केवल मार्ग निर्धारित कर सकते हैं। आपका कार्यकर्ता ऐप वेब सर्वर वन: डेटाबेस, मॉडल आदि जैसे समान संसाधनों तक आसानी से पहुंच सकता है
xaralis

1
@JaquelinePassos v1.2.0 समाधान स्टैक संस्करण है। यह आपको यह चुनने देना चाहिए कि नए वातावरण बनाते समय आप समाधान के किस संस्करण को बनाना चाहते हैं। V1.2.0 की तुलना में कुछ भी नया करना चाहिए। URL के बारे में, यह वह URL होना चाहिए जिसे आपका एप्लिकेशन सुनता है, न कि कोई फ़ाइल पथ। Django प्रबंधन कमांड चलाना संभव नहीं है, यह केवल HTTP अनुरोध करता है।
xaralis

4
एक बात जो मेरे लिए स्पष्ट नहीं है वह यह है कि अगर cron.yaml के माध्यम से क्रोन जॉब्स को चलाने के लिए एक अतिरिक्त EC2 मशीन आवंटित करने से बचने का कोई तरीका है। आदर्श रूप से यह उसी मशीन पर चलेगा जो HTTP अनुरोध (यानी वेब टियर) की सेवा कर रही है।
वेन्जेल जैकब

31

जैमीब की प्रतिक्रिया के बारे में, और अल्डरिनल उल्लेख के रूप में, आप यह सुनिश्चित करने के लिए 'लीडर_ऑनलाइन' संपत्ति का उपयोग कर सकते हैं कि केवल एक ईसी 2 उदाहरण क्रोन जॉब चलाता है।

Http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html से लिया गया उद्धरण :

आप leader_only का उपयोग कर सकते हैं। एक उदाहरण को ऑटो स्केलिंग समूह में नेता के रूप में चुना जाता है। यदि लीडर_ऑनलाइन मान को सही पर सेट किया जाता है, तो कमांड केवल उस उदाहरण पर चलता है, जिसे लीडर के रूप में चिह्नित किया गया है।

Im मेरे ईबे पर एक समान चीज हासिल करने की कोशिश कर रहा है, इसलिए यदि मैं इसे हल करता हूं तो मेरी पोस्ट को अपडेट कर देगा।

अपडेट करें:

ठीक है, मेरे पास अब निम्नलिखित ईबो कॉन्फिगरेशन का उपयोग करके क्रोनोजर काम कर रहा है:

files:
  "/tmp/cronjob" :
    mode: "000777"
    owner: ec2-user
    group: ec2-user
    content: |
      # clear expired baskets
      */10 * * * * /usr/bin/wget -o /dev/null http://blah.elasticbeanstalk.com/basket/purge > $HOME/basket_purge.log 2>&1
      # clean up files created by above cronjob
      30 23 * * * rm $HOME/purge*
    encoding: plain 
container_commands:
  purge_basket: 
    command: crontab /tmp/cronjob
    leader_only: true
commands:
  delete_cronjob_file: 
    command: rm /tmp/cronjob

अनिवार्य रूप से, मैं क्रोनॉजर के साथ एक अस्थायी फ़ाइल बनाता हूं और फिर टेम्प फ़ाइल से पढ़ने के लिए कॉन्टैब सेट करता हूं, उसके बाद टेम्प फाइल को हटा देता हूं। उम्मीद है की यह मदद करेगा।


3
आप यह कैसे सुनिश्चित करेंगे कि इस क्रेस्टैब को चलाने वाला उदाहरण ऑटो स्केलिंग द्वारा समाप्त नहीं होता है? डिफ़ॉल्ट रूप से, यह सबसे पुराना उदाहरण है।
सेबस्टियन

1
यह एक ऐसा मुद्दा है जिसे मैंने अभी तक हल किया है। यह मुझे अमेज़ॅन की कार्यक्षमता में एक दोष के रूप में बताता है कि जब वर्तमान ईबी द्वारा समाप्त किया जाता है तो लीडर_ऑनली कमांड नए नेता पर लागू नहीं होते हैं। यदि आप कुछ साझा करने के लिए आते हैं तो कृपया साझा करें!
beterthanlife

7
इसलिए मैंने (अंत में) पता लगाया कि ऑटो-स्केलिंग द्वारा नेता को समाप्त करने से कैसे रोका जाए - कस्टम ऑटो-स्केलिंग समाप्ति नीतियां। देखें docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/...
beterthanlife

1
@ नेट आप शायद अब तक यह पता लगा चुके हैं, लेकिन मेरे आदेश के पढ़ने के आधार पर कि ये "कंटेनर" से पहले "कमांड" में चलते हैं, इसलिए आप फ़ाइल बनाएंगे, फिर इसे हटा देंगे, फिर कॉन्ट्राब चलाने की कोशिश करें ।
स्पष्ट

1
@ Sebastien सबसे पुराना इरादा रखने के लिए, यहाँ मैं क्या कर रहा हूँ: 1 - ENBABLE के इरादे की समाप्ति सुरक्षा को बदलें। 2 - ऑटो स्केल समूह पर जाएं और अपनी ईबीएस एनवायरनमेंट आईडी ढूंढें, ईडीआईटी पर क्लिक करें और टर्मिनेशन नीतियों को "न्यूटेस्ट इंस्टेंस" में बदलें
रोनाल्डो बाहिया

12

जैसा कि ऊपर उल्लेख किया गया है, किसी भी कॉन्ट्राब विन्यास की स्थापना के साथ मूलभूत दोष यह है कि यह केवल तैनाती पर होता है। जैसे ही क्लस्टर ऑटो-स्केल हो जाता है, और फिर नीचे जाता है, यह भी पहले सर्वर बंद होने का पक्षधर है। इसके अलावा, कोई भी विफल नहीं होगा, जो मेरे लिए महत्वपूर्ण था।

मैंने कुछ शोध किया, फिर विचारों को उछालने और मेरे साथ आए समाधान को मान्य करने के लिए हमारे एडब्ल्यूएस खाता विशेषज्ञ से बात की। आप इसे ऑप्सवर्क्स के साथ पूरा कर सकते हैं , हालांकि यह एक मक्खी को मारने के लिए घर का उपयोग करने जैसा है। टास्क रनर के साथ डेटा पाइपलाइन का उपयोग करना भी संभव है , लेकिन इसकी स्क्रिप्ट में सीमित क्षमता है जिसे यह निष्पादित कर सकता है, और मुझे पूरे कोड आधार तक पहुंच के साथ PHP स्क्रिप्ट को चलाने में सक्षम होना चाहिए। आप ElasticBeanstalk क्लस्टर के बाहर EC2 उदाहरण भी समर्पित कर सकते हैं, लेकिन तब आपके पास फिर से कोई असफलता नहीं होती है।

इसलिए यहां मैं वही हूं जो जाहिरा तौर पर अपरंपरागत है (जैसा कि एडब्ल्यूएस प्रतिनिधि ने टिप्पणी की थी) और इसे हैक माना जा सकता है, लेकिन यह काम करता है और असफलता के साथ ठोस है। मैंने एसडीके का उपयोग करके एक कोडिंग समाधान चुना, जिसे मैं पीएचपी में दिखाऊंगा, हालांकि आप किसी भी भाषा में वही विधि कर सकते हैं जिसे आप पसंद करते हैं।

// contains the values for variables used (key, secret, env)
require_once('cron_config.inc'); 

// Load the AWS PHP SDK to connection to ElasticBeanstalk
use Aws\ElasticBeanstalk\ElasticBeanstalkClient;

$client = ElasticBeanstalkClient::factory(array(
    'key' => AWS_KEY,
    'secret' => AWS_SECRET,
    'profile' => 'your_profile',
    'region'  => 'us-east-1'
));

$result = $client->describeEnvironmentResources(array(
    'EnvironmentName' => AWS_ENV
));

if (php_uname('n') != $result['EnvironmentResources']['Instances'][0]['Id']) {
    die("Not the primary EC2 instance\n");
}

तो इस के माध्यम से चलना और यह कैसे संचालित होता है ... आप स्क्रिप्ट को कॉट्रैब से कहते हैं जैसा कि आप आम तौर पर हर ईसी 2 उदाहरण पर करते हैं। प्रत्येक स्क्रिप्ट में शुरुआत में इसे शामिल किया जाता है (या प्रत्येक के लिए एक फ़ाइल शामिल है, जैसा कि मैं इसका उपयोग करता हूं), जो एक इलास्टिकबिनस्टॉक ऑब्जेक्ट को स्थापित करता है और सभी उदाहरणों की एक सूची को पुनः प्राप्त करता है। यह सूची में केवल पहले सर्वर का उपयोग करता है, और जाँचता है कि क्या यह स्वयं से मेल खाता है, यदि यह करता है तो यह जारी रहता है, अन्यथा यह मर जाता है और बाहर बंद हो जाता है। मैंने जाँच की है और लौटाई गई सूची सुसंगत प्रतीत होती है, जो तकनीकी रूप से केवल एक मिनट के लिए सुसंगत होना चाहिए, क्योंकि प्रत्येक उदाहरण अनुसूचित क्रोन को निष्पादित करता है। यदि यह बदल जाता है, तो यह कोई फर्क नहीं पड़ता, क्योंकि फिर से यह केवल उस छोटी खिड़की के लिए प्रासंगिक है।

यह किसी भी तरह से सुरुचिपूर्ण नहीं है, लेकिन हमारी विशिष्ट आवश्यकताओं के अनुकूल है - जो एक अतिरिक्त सेवा के साथ लागत में वृद्धि नहीं करना था या एक समर्पित EC2 उदाहरण होना चाहिए, और किसी भी विफलता के मामले में असफलता होगी। हमारी क्रोन स्क्रिप्ट रखरखाव स्क्रिप्ट चलाती हैं जो SQS में रखी जाती हैं और क्लस्टर में प्रत्येक सर्वर को निष्पादित करने में मदद करता है। यदि यह आपकी आवश्यकताओं के अनुकूल है तो कम से कम यह आपको एक वैकल्पिक विकल्प दे सकता है।

-Davey


मैंने पाया कि php_uname ('n') निजी DNS नाम (जैसे ip-172.24.55.66) लौटाता है, जो आपके द्वारा खोजे जा रहे उदाहरण ID नहीं है। Php_uname () का उपयोग करने के बजाय, मैंने इसका उपयोग करना समाप्त कर दिया: $instanceId = file_get_contents("http://instance-data/latest/meta-data/instance-id"); फिर तुलना करने के लिए बस उस $ instId संस्करण का उपयोग करें ।
वैलोरम

1
क्या कोई गारंटी है कि इंस्टेंस एरे प्रत्येक डिस्क्रिप्शन कॉल पर एक ही ऑर्डर प्रस्तुत करता है? मैं प्रत्येक प्रविष्टि के ['Id'] क्षेत्र को एक सरणी में निकालने का सुझाव दूंगा, और उन्हें PHP में क्रमबद्ध करूंगा, इससे पहले कि आप जांच करें कि क्या पहली बार की गई प्रविष्टि आपका वर्तमान उदाहरण है।
गेब्रियल

इस उत्तर के आधार पर मैंने यह समाधान किया: stackoverflow.com/questions/14077095/… - यह बहुत समान है लेकिन दोहरे निष्पादन का कोई मौका नहीं है।
TheStoryCoder

11

मैंने एक एडब्ल्यूएस सपोर्ट एजेंट से बात की और यह मेरे लिए काम करने का तरीका है। 2015 समाधान:

अपने .ebextensions निर्देशिका में अपने_file_name.config के साथ एक फ़ाइल बनाएँ। कॉन्फ़िगरेशन फ़ाइल इनपुट में:

फाइलें:
  "/Etc/cron.d/cron_example":
    मोड: "000644"
    मालिक: जड़
    समूह: जड़
    सामग्री: |
      * * * * * root /usr/local/bin/cron_example.sh

  "/Usr/local/bin/cron_example.sh":
    मोड: "000755"
    मालिक: जड़
    समूह: जड़
    सामग्री: |
      #! / Bin / bash

      /us/local/bin/test_cron.sh || बाहर जाएं
      इको "क्रोन" "तिथि" >> /tmp/cron_example.log पर चल रहा है
      # अब ऐसे कार्य करें जो केवल 1 उदाहरण पर चलें ...

  "/Usr/local/bin/test_cron.sh":
    मोड: "000755"
    मालिक: जड़
    समूह: जड़
    सामग्री: |
      #! / Bin / bash

      मेटाडाटा = / opt / एडब्ल्यूएस / bin / EC2-मेटाडाटा
      INSTANCE_ID = `$ METADATA -i | awk '{प्रिंट $ 2}' '
      क्षेत्र = `$ METADATA -z | awk '{प्रिंट पदार्थ ($ 2, 0, लंबाई ($ 2) -1)}' `

      # हमारे ऑटो स्केलिंग समूह का नाम खोजें।
      ASG = Gaws ec2 वर्णन-टैग --filters "नाम = संसाधन-आईडी, मान = $ INSTANCE_ID"
        --region $ REGION --आउट टेक्स्ट | awk '/ aws: autoscaling: groupName / {प्रिंट $ 5}' `

      # समूह में पहला उदाहरण खोजें
      FIRST = oscaws ऑटो-स्केलिंग-समूहों का ऑटो-स्केलिंग विवरण - ऑटो-स्केलिंग-समूह-नाम ASS \
        - भाग $ $ - पाठ पाठ | awk '/ InService $ / {प्रिंट $ 4}' | सॉर्ट | सिर -1`

      # यदि वे समान हैं तो परीक्षण करें।
      ["$ FIRST" = "$ INSTANCE_ID"]

कमांड:
  rm_old_cron:
    आदेश: "rm * .bak"
    cwd: "/etc/cron.d"
    इग्नोरर्स: सच

इस समाधान में 2 कमियां हैं:

  1. बाद की तैनाती पर, बीनस्टॉक मौजूदा क्रॉन स्क्रिप्ट को .bak के रूप में नाम देता है, लेकिन क्रोन अभी भी इसे चलाएगा। आपका क्रोन अब एक ही मशीन पर दो बार निष्पादित करता है।
  2. यदि आपका वातावरण बढ़ता है, तो आपको कई उदाहरण मिलते हैं, सभी आपकी क्रोन लिपि को चलाते हैं। इसका मतलब है कि आपके मेल शॉट्स दोहराए जाते हैं, या आपके डेटाबेस अभिलेखों को दोहराया जाता है

युक्ति:

  1. कोई भी .extension स्क्रिप्ट सुनिश्चित करें जो क्रोन बनाता है। बाद की तैनाती पर .bak फ़ाइलों को हटा देता है।
  2. एक सहायक स्क्रिप्ट है जो निम्न कार्य करता है: - मेटाडेटा से वर्तमान इंस्टेंस आईडी प्राप्त करता है - EC2 टैग से वर्तमान ऑटो स्केलिंग समूह का नाम हो जाता है - उस समूह में EC2 इंस्टेंसेस की सूची को वर्णानुक्रम से क्रमबद्ध करता है। - उस सूची में से पहला उदाहरण लेता है। - चरण 4 से पहली इंस्टेंस आईडी के साथ चरण 1 से इंस्टेंस आईडी की तुलना करें। आपकी क्रोन स्क्रिप्ट तब इस सहायक स्क्रिप्ट का उपयोग कर सकती हैं यह निर्धारित करने के लिए कि क्या उन्हें निष्पादित करना चाहिए।

चेतावनी:

  • बीनस्टॉक उदाहरणों के लिए प्रयुक्त IAM भूमिका को ec2 की आवश्यकता होती है: DescribeTags और autoscaling: DescribeAutoScalingGroups अनुमतियाँ
  • जिन उदाहरणों को चुना गया है, उन्हें ऑटो स्केलिंग द्वारा InService के रूप में दिखाया गया है। यह जरूरी नहीं कि वे आपके क्रोन को चलाने के लिए पूरी तरह से तैयार हैं और तैयार हैं।

यदि आप डिफ़ॉल्ट बीनस्टॉक भूमिका का उपयोग कर रहे हैं तो आपको IAM रोल्स सेट करने की आवश्यकता नहीं होगी।


7

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

अद्यतन मैंने AWS ऑप्सवर्क्स का उपयोग करने के लिए स्विच किया और अब इस रत्न को बनाए नहीं रख रहा हूँ। यदि आपको लोचदार बीनस्टॉक की मूल बातें उपलब्ध हैं, तो मुझे अधिक कार्यक्षमता की आवश्यकता है, मैं अत्यधिक OpsWorks पर स्विच करने की सलाह देता हूं।


क्या आप हमें बताएंगे कि आपने OpsWorks का उपयोग करके इसे कैसे हल किया? क्या आप कस्टम लेयर चला रहे हैं जो क्रॉन-जॉब्स करता है?
टॉमी

हाँ, मेरे पास एक व्यवस्थापक / क्रोन परत है जो केवल एक सर्वर पर चलता है। मैंने एक कस्टम कुकबुक स्थापित की, जिसमें मेरे सभी क्रोन जॉब्स हैं। AWS के पास docs.aws.amazon.com/opsworks/latest/userguide/… पर एक गाइड है ।
dignoe

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

6

आप वास्तव में इलास्टिक बीनस्टॉक पर क्रोन जॉब्स चलाना नहीं चाहते हैं। चूंकि आपके पास कई एप्लिकेशन इंस्टेंसेस होंगे, इसलिए यह दौड़ की स्थिति और अन्य विषम समस्याएं पैदा कर सकता है। मैंने हाल ही में इस बारे में ब्लॉग किया है (पेज के 4 वें या 5 वें सिरे पर)। लघु संस्करण: आवेदन के आधार पर, SQS या लोहे की तरह तीसरे पक्ष के समाधान की तरह एक नौकरी कतार का उपयोग करें ।


SQS गारंटी नहीं देता है कि कोड केवल एक बार चलाया जाएगा। मुझे लोहे की साइट पसंद है। मैं इसकी जांच करने जा रहा हूं।
नाथन एच।

अपने ब्लॉग पोस्ट में भी आप RDS पर InnoDB का उपयोग करने की सलाह देते हैं। मैं अपने कार्यों को संग्रहीत करने के लिए RDS पर एक तालिका का उपयोग करता हूं और केवल एक सर्वर उन कार्यों को चलाने के लिए सुनिश्चित करने के लिए InnoDB "का चयन करें ... अद्यतन" सुविधा का उपयोग करता है। बिना क्रॉन जॉब या यूजर इंटरेक्शन के आपका ऐप SQS से कैसे संपर्क करता है?
जेम्स एल्डे

1
@JamesAlday यह SO प्रश्न बहुत पुराना है। चूंकि मैंने उपरोक्त टिप्पणी लिखी थी, इसलिए AWS ने मास्टर के रूप में चल रहे सर्वरों में से एक का चुनाव करके इलास्टिक बीनस्टॉक पर क्रोन नौकरियों को संभालने का एक सुंदर तरीका पेश किया। यह कहने के बाद, ऐसा लगता है कि आप क्रोन + MySQL का दुरुपयोग एक नौकरी कतार के रूप में कर रहे हैं। हालाँकि मुझे ठोस अनुशंसाएँ देने से पहले मुझे आपके ऐप के बारे में बहुत कुछ जानना होगा।
जामिअब

मेरे पास एक स्क्रिप्ट है जो क्रोन के माध्यम से चलती है जो नौकरियों को चलाने के लिए एक तालिका की जांच करती है। लेन-देन का उपयोग कई सर्वरों को एक ही कार्य को चलाने से रोकता है। मैंने SQS में देखा है, लेकिन आपको एक मास्टर सर्वर की आवश्यकता है जो इसे वितरित करने के बजाय सभी स्क्रिप्ट चलाता है और आपको एक ही स्क्रिप्ट को कई बार चलाने के लिए सुनिश्चित करने के लिए तर्क लिखने की आवश्यकता नहीं है। लेकिन मैं अभी भी इस बात को लेकर असमंजस में हूँ कि आपको उपयोगकर्ता सहभागिता या क्रॉन के बिना चलाने के लिए कैसे कार्य मिलेंगे - कतार में कार्यों को चलाने के लिए आपके ऐप को क्या ट्रिगर करता है?
जेम्स एल्डे

5

2017: यदि आप Laravel5 + का उपयोग कर रहे हैं

इसे कॉन्फ़िगर करने के लिए आपको बस 2 मिनट चाहिए:

  • वर्कर टीयर बनाएं
  • लार्वा-एवर्स-वर्कर स्थापित करें

    composer require dusterio/laravel-aws-worker

  • रूट फ़ोल्डर में cron.yaml जोड़ें:

अपने एप्लिकेशन के रूट फ़ोल्डर में cron.yaml जोड़ें (यह आपके रेपो का एक हिस्सा हो सकता है या आप इस फ़ाइल को EB पर लागू करने से ठीक पहले जोड़ सकते हैं - महत्वपूर्ण बात यह है कि यह फ़ाइल परिनियोजन के समय मौजूद है):

version: 1
cron:
 - name: "schedule"
   url: "/worker/schedule"
   schedule: "* * * * *"

बस!

App\Console\Kernelअब आपके सभी कार्य निष्पादित हो जाएंगे

विस्तृत निर्देश और स्पष्टीकरण: https://github.com/dusterio/laravel-aws-worker

Laravel के अंदर कार्य कैसे लिखें: https://laravel.com/docs/5.4/scheduling


3

के filesबजाय का उपयोग कर एक और अधिक पठनीय समाधान container_commands:

फाइलें:
  "/Etc/cron.d/my_cron":
    मोड: "000644"
    मालिक: जड़
    समूह: जड़
    सामग्री: |
      # डिफ़ॉल्ट ईमेल पता ओवरराइड करें
      Mailto = "example@gmail.com"
      # हर पांच मिनट में एक सिम्फनी कमांड चलाएं (ec2-user के रूप में)
      * * 10 * * * * ec2-user / usr / bin / php / var / app / current / app / कंसोल करना: कुछ
    एन्कोडिंग: सादा
कमांड:
  # लोचदार बीनस्टॉक द्वारा बनाई गई बैकअप फ़ाइल को हटाएं
  clear_cron_backup:
    कमांड: rm -f /etc/cron.d/watson.bak

ध्यान दें कि प्रारूप सामान्य crontab प्रारूप से भिन्न होता है, क्योंकि यह उपयोगकर्ता को कमांड चलाने के लिए निर्दिष्ट करता है।


यहाँ एक मुद्दा यह है कि इलास्टिक बीनस्टॉक EC2 उदाहरणों में डिफ़ॉल्ट रूप से SMTP सेवाएँ नहीं होती हैं, इसलिए यहाँ MAILTO विकल्प काम नहीं कर सकता है।
जस्टिन फिंकेलस्टीन

3

2018 के लिए मेरा 1 प्रतिशत योगदान है

यहाँ यह करने का सही तरीका है (उपयोग django/pythonऔर django_crontabअनुप्रयोग):

अंदर .ebextensionsफ़ोल्डर इस तरह से एक फ़ाइल बनाएँ 98_cron.config:

files:
  "/tmp/98_create_cron.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/sh
      cd /
      sudo /opt/python/run/venv/bin/python /opt/python/current/app/manage.py crontab remove > /home/ec2-user/remove11.txt
      sudo /opt/python/run/venv/bin/python /opt/python/current/app/manage.py crontab add > /home/ec2-user/add11.txt 

container_commands:
    98crontab:
        command: "mv /tmp/98_create_cron.sh /opt/elasticbeanstalk/hooks/appdeploy/post && chmod 774 /opt/elasticbeanstalk/hooks/appdeploy/post/98_create_cron.sh"
        leader_only: true

इसके container_commandsबजाय होना चाहिएcommands


2

जब कोई नेता नए नेता पैदा होते हैं, तो कोई नेता के बारे में सोच रहा था। मुझे यह पता नहीं लग सकता है कि उनकी टिप्पणियों का जवाब कैसे दिया जाए, लेकिन इस लिंक को देखें: http://blog.paulopoiati.com/2013/08/25/running-cron-in-elastic-beanstalk-auto-scaling- वातावरण/


2

अमेज़ॅन का नवीनतम उदाहरण सबसे आसान और सबसे कुशल (आवधिक कार्य) है:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html

जहाँ आप अपने किसी भी क्रॉन जॉब्स को अंजाम देने के लिए एक अलग वर्कर टियर बनाते हैं। Cron.yaml फ़ाइल बनाएं और इसे अपने रूट फ़ोल्डर में रखें। एक मुद्दा जो मेरे पास था (क्रॉन के निष्पादन के बाद नहीं लगता था) यह पा रहा था कि मेरी कोडपीलाइन में डायनामोडब संशोधन करने का अधिकार नहीं था। इसके आधार पर IAM के तहत FullDynamoDB पहुँच को जोड़ने के बाद -> भूमिकाएँ -> yourpipeline और redeploying (लोचदार बीनस्टॉक) यह पूरी तरह से काम करता है।


1

यहाँ समाधान का पूरा विवरण दिया गया है:

http://blog.paulopoiati.com/2013/08/25/running-cron-in-elastic-beanstalk-auto-scaling-environment/


ASG के भीतर एक अद्वितीय उदाहरण बनाने के लिए leader_only का उपयोग न करें। एएसजी कभी गारंटी नहीं देता है कि आप उस विशिष्ट उदाहरण को बनाए रखने में सक्षम होंगे, लेकिन यह केवल सेवा में उस उदाहरण की संख्या की गारंटी देता है। ईबी स्वास्थ्य जांच विफल होने के कारण नेता का उदाहरण समाप्त हो सकता है।
mst

1

इसलिए हम कुछ समय के लिए इससे जूझ रहे हैं और AWS प्रतिनिधि के साथ कुछ चर्चा के बाद आखिरकार मुझे लगता है कि मुझे सबसे अच्छा समाधान है।

Cron.yaml के साथ एक कार्यकर्ता स्तरीय का उपयोग करना निश्चित रूप से सबसे आसान फिक्स है। हालाँकि, दस्तावेज़ीकरण स्पष्ट नहीं करता है कि यह SQS कतार के अंत में काम करेगा जो आप वास्तव में अपनी नौकरी चलाने के लिए उपयोग कर रहे हैं। यदि आपकी क्रॉन जॉब्स समय के प्रति संवेदनशील हैं (कई हैं), तो यह स्वीकार्य नहीं है, क्योंकि यह कतार के आकार पर निर्भर करेगा। एक विकल्प सिर्फ क्रोन जॉब्स को चलाने के लिए एक पूरी तरह से अलग वातावरण का उपयोग करना है, लेकिन मुझे लगता है कि यह ओवरकिल है।

अन्य विकल्पों में से कुछ, यह जाँचने के लिए कि क्या आप सूची में पहले उदाहरण हैं, या तो आदर्श नहीं हैं। क्या होगा यदि वर्तमान पहला उदाहरण बंद करने की प्रक्रिया में है?

इंस्टेंस प्रोटेक्शन भी मुद्दों के साथ आ सकता है - क्या होगा अगर वह इंस्टेंस लॉक / फ्रोजन हो जाए?

यह समझना महत्वपूर्ण है कि AWS स्वयं cron.yaml कार्यक्षमता का प्रबंधन कैसे करता है। एक SQS डेमन है जो "लीडर इलेक्शन" को संभालने के लिए डायनमो टेबल का उपयोग करता है। यह इस तालिका में बार-बार लिखता है, और यदि वर्तमान नेता ने थोड़ी देर में नहीं लिखा है, तो अगला उदाहरण नेता के रूप में होगा। इस तरह से डेमन तय करता है कि कौन सा उदाहरण नौकरी को एसक्यूएस कतार में आग लगाने के लिए है।

हम अपने स्वयं के फिर से लिखने की कोशिश करने के बजाय मौजूदा कार्यक्षमता का पुनरुत्पादन कर सकते हैं। आप पूरा समाधान यहां देख सकते हैं: https://gist.github.com/dorner/4517fe2b8c79ccb3971084ec28267f27

यह रूबी में है, लेकिन आप इसे किसी अन्य भाषा में आसानी से अनुकूलित कर सकते हैं, जिसमें AWS SDK है। अनिवार्य रूप से, यह वर्तमान नेता की जांच करता है, फिर यह सुनिश्चित करने के लिए राज्य की जांच करता है कि यह एक अच्छे राज्य में है। यह तब तक लूप करेगा जब तक कि एक अच्छे राज्य में एक वर्तमान नेता नहीं है, और यदि वर्तमान उदाहरण नेता है, तो नौकरी निष्पादित करें।


0

यह नियंत्रित करने के लिए कि स्केलिंग करते समय ऑटो स्केलिंग किसी विशेष उदाहरण को समाप्त कर सकती है या नहीं, सुरक्षा संरक्षण का उपयोग करें। आप ऑटो स्केलिंग समूह या व्यक्तिगत ऑटो स्केलिंग इंस्टेंस पर इंस्टेंस सुरक्षा सेटिंग को सक्षम कर सकते हैं। जब ऑटो स्केलिंग एक उदाहरण लॉन्च करता है, तो उदाहरण ऑटो स्केलिंग समूह के इंस्टेंस प्रोटेक्शन सेटिंग को इनहेरिट करता है। आप किसी भी समय किसी ऑटो स्केलिंग समूह या किसी ऑटो स्केलिंग आवृत्ति के लिए इंस्टेंस सुरक्षा सेटिंग बदल सकते हैं।

http://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html#instance-protection


0

मेरे पास इसका एक और उपाय था कि यदि php फाइल को cron के माध्यम से चलाने की आवश्यकता है और यदि आपने कोई NAT उदाहरण सेट किया है, तो आप nron उदाहरण पर cronjob डाल सकते हैं और wget के माध्यम से php फ़ाइल चला सकते हैं।


0

यहाँ एक फिक्स इंसेज़ है जिसे आप PHP में करना चाहते हैं। आपको इस तरह से काम करने के लिए बस अपने .ebextensions फ़ोल्डर में cronjob.config की आवश्यकता है।

files:
  "/etc/cron.d/my_cron":
    mode: "000644"
    owner: root
    group: root
    content: |
        empty stuff
    encoding: plain
commands:
  01_clear_cron_backup:
    command: "rm -f /etc/cron.d/*.bak"
  02_remove_content:
    command: "sudo sed -i 's/empty stuff//g' /etc/cron.d/my_cron"
container_commands:
  adding_cron:
    command: "echo '* * * * * ec2-user . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/app/current/index.php cron sendemail > /tmp/sendemail.log 2>&1' > /etc/cron.d/my_cron"
    leader_only: true

envvars फ़ाइलों के लिए पर्यावरण चर प्राप्त करता है। आप tmp / sendemail.log पर आउटपुट को ऊपर के रूप में डीबग कर सकते हैं।

आशा है कि यह किसी की मदद करता है क्योंकि यह निश्चित रूप से हमारी मदद करता है!


0

User1599237 से उत्तर के सिद्धांतों के आधार पर , जहां आप क्रोन नौकरियों को सभी उदाहरणों पर चलने देते हैं, लेकिन फिर नौकरियों की शुरुआत में निर्धारित करते हैं कि क्या उन्हें चलाने की अनुमति दी जानी चाहिए, मैंने एक और समाधान किया है।

बजाय चल रहे उदाहरणों को देखने के (और अपनी एडब्ल्यूएस कुंजी और गुप्त स्टोर करने के लिए) मैं MySQL डेटाबेस का उपयोग कर रहा हूं जिसे मैं पहले से ही सभी उदाहरणों से जोड़ रहा हूं।

इसका कोई डाउनसाइड नहीं है, केवल सकारात्मक:

  • कोई अतिरिक्त उदाहरण या खर्च नहीं
  • रॉक सॉलिड सॉल्यूशन - दोहरे निष्पादन का कोई मौका नहीं
  • स्केलेबल - स्वचालित रूप से आपके उदाहरणों को ऊपर और नीचे स्केल किया जाता है
  • असफलता - स्वचालित रूप से काम करने की स्थिति में एक विफलता होती है

वैकल्पिक रूप से, आप डेटाबेस के बजाय आम तौर पर साझा किए गए फाइल सिस्टम (जैसे एडब्ल्यूएस ईएफएस एनएफएस प्रोटोकॉल के माध्यम से) का उपयोग कर सकते हैं।

निम्न समाधान PHP फ्रेमवर्क Yii के भीतर बनाया गया है, लेकिन आप इसे आसानी से किसी अन्य ढांचे और भाषा के लिए अनुकूलित कर सकते हैं। इसके अलावा अपवाद हैंडलर Yii::$app->systemमेरे खुद का एक मॉड्यूल है। इसे आप जो भी उपयोग कर रहे हैं, उसके साथ बदलें।

/**
 * Obtain an exclusive lock to ensure only one instance or worker executes a job
 *
 * Examples:
 *
 * `php /var/app/current/yii process/lock 60 empty-trash php /var/app/current/yii maintenance/empty-trash`
 * `php /var/app/current/yii process/lock 60 empty-trash php /var/app/current/yii maintenance/empty-trash StdOUT./test.log`
 * `php /var/app/current/yii process/lock 60 "empty trash" php /var/app/current/yii maintenance/empty-trash StdOUT./test.log StdERR.ditto`
 * `php /var/app/current/yii process/lock 60 "empty trash" php /var/app/current/yii maintenance/empty-trash StdOUT./output.log StdERR./error.log`
 *
 * Arguments are understood as follows:
 * - First: Duration of the lock in minutes
 * - Second: Job name (surround with quotes if it contains spaces)
 * - The rest: Command to execute. Instead of writing `>` and `2>` for redirecting output you need to write `StdOUT` and `StdERR` respectively. To redirect stderr to stdout write `StdERR.ditto`.
 *
 * Command will be executed in the background. If determined that it should not be executed the script will terminate silently.
 */
public function actionLock() {
    $argsAll = $args = func_get_args();
    if (!is_numeric($args[0])) {
        \Yii::$app->system->error('Duration for obtaining process lock is not numeric.', ['Args' => $argsAll]);
    }
    if (!$args[1]) {
        \Yii::$app->system->error('Job name for obtaining process lock is missing.', ['Args' => $argsAll]);
    }

    $durationMins = $args[0];
    $jobName = $args[1];
    $instanceID = null;
    unset($args[0], $args[1]);

    $command = trim(implode(' ', $args));
    if (!$command) {
        \Yii::$app->system->error('Command to execute after obtaining process lock is missing.', ['Args' => $argsAll]);
    }

    // If using AWS Elastic Beanstalk retrieve the instance ID
    if (file_exists('/etc/elasticbeanstalk/.aws-eb-system-initialized')) {
        if ($awsEb = file_get_contents('/etc/elasticbeanstalk/.aws-eb-system-initialized')) {
            $awsEb = json_decode($awsEb);
            if (is_object($awsEb) && $awsEb->instance_id) {
                $instanceID = $awsEb->instance_id;
            }
        }
    }

    // Obtain lock
    $updateColumns = false;  //do nothing if record already exists
    $affectedRows = \Yii::$app->db->createCommand()->upsert('system_job_locks', [
        'job_name' => $jobName,
        'locked' => gmdate('Y-m-d H:i:s'),
        'duration' => $durationMins,
        'source' => $instanceID,
    ], $updateColumns)->execute();
    // The SQL generated: INSERT INTO system_job_locks (job_name, locked, duration, source) VALUES ('some-name', '2019-04-22 17:24:39', 60, 'i-HmkDAZ9S5G5G') ON DUPLICATE KEY UPDATE job_name = job_name

    if ($affectedRows == 0) {
        // record already exists, check if lock has expired
        $affectedRows = \Yii::$app->db->createCommand()->update('system_job_locks', [
                'locked' => gmdate('Y-m-d H:i:s'),
                'duration' => $durationMins,
                'source' => $instanceID,
            ],
            'job_name = :jobName AND DATE_ADD(locked, INTERVAL duration MINUTE) < NOW()', ['jobName' => $jobName]
        )->execute();
        // The SQL generated: UPDATE system_job_locks SET locked = '2019-04-22 17:24:39', duration = 60, source = 'i-HmkDAZ9S5G5G' WHERE job_name = 'clean-trash' AND DATE_ADD(locked, INTERVAL duration MINUTE) < NOW()

        if ($affectedRows == 0) {
            // We could not obtain a lock (since another process already has it) so do not execute the command
            exit;
        }
    }

    // Handle redirection of stdout and stderr
    $command = str_replace('StdOUT', '>', $command);
    $command = str_replace('StdERR.ditto', '2>&1', $command);
    $command = str_replace('StdERR', '2>', $command);

    // Execute the command as a background process so we can exit the current process
    $command .= ' &';

    $output = []; $exitcode = null;
    exec($command, $output, $exitcode);
    exit($exitcode);
}

यह डेटाबेस स्कीमा है जिसका मैं उपयोग कर रहा हूं:

CREATE TABLE `system_job_locks` (
    `job_name` VARCHAR(50) NOT NULL,
    `locked` DATETIME NOT NULL COMMENT 'UTC',
    `duration` SMALLINT(5) UNSIGNED NOT NULL COMMENT 'Minutes',
    `source` VARCHAR(255) NULL DEFAULT NULL,
    PRIMARY KEY (`job_name`)
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.