मैं management command बनाने का सुझाव दूंगा जो क्रॉन के साथ चलता है।
इस विधि का उपयोग करके, आपके पास काम करने के लिए आपका पूरा Django ORM, सभी विधियां इत्यादि हैं। कोशिश/छोड़कर अपनी स्क्रिप्ट को लपेटकर, आपके पास विफलताओं को लॉग इन करने का विकल्प है - ईमेल अधिसूचनाएं, बाहरी लॉगिंग सिस्टम जैसे सेंट्री, सीधे डीबी आदि।
मैं उपयोगकर्ता पर्यवेक्षक क्रॉन चलाने के लिए और यह अच्छा काम करता है। यह समय-परीक्षण उपकरण पर निर्भर करता है जो आपको नीचे नहीं जाने देगा।
अंत में, बैच नौकरी चलाने के लिए या वर्तमान में ऐसे वातावरण में चलने के लिए डेटाबेस सिंगलटन का उपयोग करके जहां आपके पास Django लोड लोड-संतुलित चलने के कई उदाहरण खराब अभ्यास नहीं हैं, भले ही आपको लगता है इसके बारे में थोड़ा अजीब। डीबी संसाधित होने पर आपको यह बताने का एक बहुत ही विश्वसनीय माध्यम है।
क्रॉन के बारे में एक कष्टप्रद बात यह है कि यह Django के लिए आवश्यक पर्यावरण चर आयात नहीं करता है। मैंने इसे एक साधारण पायथन लिपि के साथ हल किया।
यह आवश्यक पर्यावरण चर आदि के साथ स्टार्टअप पर क्रोंटैब लिखता है। यह उदाहरण उबंटू के लिए ईबीएस पर है लेकिन प्रासंगिक होना चाहिए।
#!/usr/bin/env python
# run-cron.py
# sets environment variable crontab fragments and runs cron
import os
from subprocess import call
from master.settings import IS_AWS
# read django's needed environment variables and set them in the appropriate crontab fragment
eRDS_HOSTNAME = os.environ["RDS_HOSTNAME"]
eRDS_DB_NAME = os.environ["RDS_DB_NAME"]
eRDS_PASSWORD = os.environ["RDS_PASSWORD"]
eRDS_USERNAME = os.environ["RDS_USERNAME"]
try:
eAWS_STAGING = os.environ["AWS_STAGING"]
except KeyError:
eAWS_STAGING = None
try:
eAWS_PRODUCTION = os.environ["AWS_PRODUCTION"]
except KeyError:
eAWS_PRODUCTION = None
eRDS_PORT = os.environ["RDS_PORT"]
if IS_AWS:
fto = '/etc/cron.d/stortrac-cron'
else:
fto = 'test_cron_file'
with open(fto,'w+') as file:
file.write('# Auto-generated cron tab that imports needed variables and runs a python script')
file.write('\nRDS_HOSTNAME=')
file.write(eRDS_HOSTNAME)
file.write('\nRDS_DB_NAME=')
file.write(eRDS_DB_NAME)
file.write('\nRDS_PASSWORD=')
file.write(eRDS_PASSWORD)
file.write('\nRDS_USERNAME=')
file.write(eRDS_USERNAME)
file.write('\nRDS_PORT=')
file.write(eRDS_PORT)
if eAWS_STAGING is not None:
file.write('\nAWS_STAGING=')
file.write(eAWS_STAGING)
if eAWS_PRODUCTION is not None:
file.write('\nAWS_PRODUCTION=')
file.write(eAWS_PRODUCTION)
file.write('\n')
# Process queue of gobs
file.write('\n*/8 * * * * root python /code/app/manage.py queue --process-queue')
# Every 5 minutes, double-check thing is done
file.write('\n*/5 * * * * root python /code/app/manage.py thing --done')
# Every 4 hours, do this
file.write('\n8 */4 * * * root python /code/app/manage.py process_this')
# etc.
file.write('\n3 */4 * * * root python /ode/app/manage.py etc --silent')
file.write('\n\n')
if IS_AWS:
args = ["cron","-f"]
call(args)
और supervisord.conf में:
[program:cron]
command = python /my/directory/runcron.py
autostart = true
autorestart = false
स्रोत
2017-01-12 17:41:24
नेता उदाहरण पर इसे चलाने के साथ समस्या क्या है? यदि वह उदाहरण स्वास्थ्य जांच में विफल रहता है तो एक और उदाहरण प्रचारित किया जाएगा। – Gustaf
सेलेरीबीट विफल होने पर स्वास्थ्य जांच विफल होने के बारे में मैं कैसे जाउंगा? –
यदि आप विफलता के बिंदुओं के बारे में चिंतित हैं और आप बहु-आवृत्ति भार संतुलन कर रहे हैं, तो शायद समर्पित लॉगिंग/निगरानी मशीन स्थापित करने या सेवा में खरीदारी करने पर विचार करने का समय हो सकता है। अमेज़ॅन एक प्रदान करता है। मुझे सेंट्री पसंद है। –