2010-07-20 18 views
161

मैं क्रॉन से Django प्रबंधन कमांड चलाने की कोशिश कर रहा हूं। मैं अपने प्रोजेक्ट को सैंडबॉक्स रखने के लिए वर्चुअलएन्व का उपयोग कर रहा हूं।क्रॉन और वर्चुअलनेव

मैं से प्रबंधन आदेशों चल virtualenv के भीतर की तरह चलता है कि यहाँ और कहीं और उदाहरण देखा है:

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg 

हालांकि, भले ही syslog एक प्रविष्टि जब काम शुरू कर दिया जाना चाहिए था पता चलता है, इस कार्य को वास्तव में कभी रन (स्क्रिप्ट के लिए लॉग फ़ाइल खाली है)। यदि मैं खोल से मैन्युअल रूप से लाइन चलाता हूं, तो यह अपेक्षा के अनुसार काम करता है।

एक ही रास्ता मैं वर्तमान में क्रॉन के माध्यम से चलाने के लिए आदेश प्राप्त कर सकते हैं, आदेशों को तोड़ने और उन्हें एक गूंगा बैश आवरण लिपि में डाल करने के लिए है:

#!/bin/sh 
source /home/user/project/env/bin/activate 
cd /home/user/project/ 
./manage.py command arg 

संपादित करें:

आर्स आया आदेशों के एक कामकाजी संयोजन के साथ:

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg 

कम से कम मेरे मामले में, वर्चुअलनेव के लिए सक्रिय स्क्रिप्ट का आह्वान करने से कुछ भी नहीं हुआ। यह शो के साथ काम करता है।

+0

एक अंतर यह है कि मुझे लगता है कि स्क्रिप्ट के साथ/घर/उपयोगकर्ता/वर्तमान कार्यशील निर्देशिका के रूप में परियोजना manage.py चलेंगे है। आपका क्रॉन कमांड आपके होम निर्देशिका के साथ cwd के रूप में चलाया जाएगा। शायद लॉग फ़ाइल वहाँ है? – rettops

+0

दरअसल लॉग पथ बिल्कुल परिभाषित किया गया है, यह केवल स्क्रिप्ट नहीं चल रहा है क्योंकि इसे अभी तक बनाया/जोड़ा नहीं गया है। –

+0

क्रॉन मुद्दों के लिए एक त्वरित और गंदे समाधान आपके पर्यावरण को डंप करना है (जिसमें आपका आदेश निष्पादित रूप से काम कर रहा है) 'env' और' export' उन सभी को एक बैश स्क्रिप्ट रैपर में जिसे आप क्रोंटैब से कॉल करते हैं। – jberryman

उत्तर

170

आप अपने आभासी वातावरण में python का उपयोग करके ऐसा करने के लिए सक्षम होना चाहिए:

/home/my/virtual/bin/python /home/my/project/manage.py command arg 

संपादित करें: अपने Django परियोजना PYTHONPATH में नहीं है, तो आप सही करने के लिए स्विच करना होगा निर्देशिका:

cd /home/my/project && /home/my/virtual/bin/python ... 

तुम भी क्रॉन से विफलता प्रवेश करने का प्रयास कर सकते हैं:

cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1 
#!/home/my/virtual/bin/python 
+1

यह भी काम नहीं करता है। उन चीजों की सूची में रखना भूल गए जो काम नहीं करते हैं। हां, मैं उस कमांड को मैन्युअल रूप से खोल में चला सकता हूं लेकिन यह क्रॉन से काम नहीं करता है। –

+0

क्या आपने पूर्ण पथ के साथ '~' को प्रतिस्थापित किया था? (आपने शायद किया है, बस सुनिश्चित कर रहा है ...) – ars

+0

आह, आप एक कामकाजी उदाहरण के साथ आए हैं! मैंने प्रत्येक संयोजन के बारे में कोशिश की है और वर्चुअलएन्व को सक्रिय करने से कोई प्रभाव नहीं पड़ता है। मैं अपने PYTHONPATH को .bashrc में सेट करता हूं लेकिन यह स्पष्ट रूप से क्रॉन द्वारा उपयोग नहीं किया जाता है? आपके उत्तर को हाइलाइट करने के लिए मेरे प्रश्न को अपडेट कर देगा। –

64

एक cronfile से source रनिंग क्रॉन के रूप में काम नहीं करेगा उसके डिफ़ॉल्ट शेल के रूप में /bin/sh का उपयोग करता है, जो समर्थन नहीं करता:कोशिश करने के लिए एक और बात बहुत शीर्ष पर अपने manage.py लिपि में यही बदलाव अवश्य करें है source

SHELL=/bin/bash 
*/10 * * * * root source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command > /dev/null 

यह पहचानना क्यों इस /var/log/syslog के रूप में विफल रहता है त्रुटि विवरण लॉग नहीं मुश्किल है: आप /bin/bash हो शेल वातावरण चर सेट करना होगा। खुद को रूट करने के लिए सबसे अच्छा है ताकि आप किसी भी क्रॉन त्रुटियों के साथ ईमेल प्राप्त कर सकें। बस अपने आप को /etc/aliases पर जोड़ें और sendmail -bi चलाएं।

अधिक यहाँ जानकारी: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

+9

या '।' (डॉट कमांड), जो/bin/sh 'द्वारा समर्थित है।/path/to/virtualenv/bin/activate' –

+4

डेविड विंटरबॉटम, यदि यह आपका असली नाम है, तो आप मेरे नायक हैं। मैं कभी नहीं जानता था कि बनाम बैश और स्रोत फाइलों के बारे में। आपने मेरे छोटे-छोटे-स्क्रिप्टिंग विश्व दोस्त में प्रकाश डाला है। धन्यवाद। – joemurphy

+0

यदि आपके पास 'पोस्टएक्टिवेट' फ़ाइल है, तो आपको 'स्रोत/पथ/से/वर्चुअलनेव/बिन/सक्रिय/स्रोत/पथ// वर्चुअलनव/बिन/पोस्टएक्टिवेट' – dspacejs

11

बजाय virtualenv विशेष shebangs के साथ आसपास mucking, बस PATH crontab पर पहले जोड़ें।

एक सक्रिय virtualenv से, इन तीन आदेशों को चलाने और अजगर स्क्रिप्ट सिर्फ काम करना चाहिए:

$ echo "PATH=$PATH" > myserver.cron 
$ crontab -l >> myserver.cron 
$ crontab myserver.cron 

crontab की पहली लाइन अब इस तरह दिखना चाहिए:

PATH=/home/me/virtualenv/bin:/usr/bin:/bin: # [etc...] 
+1

कोई अच्छा समाधान नहीं है। क्रोंटैब में प्रत्येक पायथन कार्य वर्चुअलनेव से बाइनरी के साथ चलाएंगे। उस बाइनरी को _pseudo-global_ पायथन बनाना वर्चुअलएन्व के बहुत ही उद्देश्य के खिलाफ चला जाता है। –

7

केवल सही तरीका चलाने के लिए वर्चुअलनव का उपयोग करते समय पायथन क्रॉन नौकरियां पर्यावरण को सक्रिय करना है और फिर अपना कोड चलाने के लिए पर्यावरण के पायथन को निष्पादित करना है। http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python

एक अन्य समाधान पर्यावरण को सक्रिय करने और /bin/bash में पाइप सहित पूरा आदेश गूंज रहा है:

एक तरीका यह है करने के लिए अपने अजगर स्क्रिप्ट में activate_this virtualenv का उपयोग करते हैं, देखते हैं। अपने /etc/crontab के लिए इस पर विचार करें:

***** root echo 'source /env/bin/activate; python /your/script' | /bin/bash 
+0

मैं इस बात से बहुत उत्सुक हूं कि क्या सर्वसम्मति है कि यह वास्तव में एकमात्र सही तरीका है। –

+0

यह शायद एकमात्र सही तरीका है। लेकिन काम करने के अन्य तरीके भी हैं। – Will

+2

यह "एकमात्र सही तरीका नहीं है।" मैंने वर्चुअलनेव की पाइथन बाइनरी, जैसे '/ home/user/folder/env/bin/python' पर cronjob को इंगित करके वर्चुअलनव में एक स्क्रिप्ट सफलतापूर्वक निष्पादित की है। पर्यावरण को सक्रिय करने की कोई ज़रूरत नहीं है। – tracicot

1

मेरे लिए सबसे अच्छा समाधान दोनों

  • के लिए गया था venv bin/निर्देशिका
  • अजगर पथ सेट में अजगर द्विआधारी का उपयोग venv मॉड्यूल शामिल करने के लिए निर्देशिका।

man python खोल का उपयोग कर ऐसा करने के लिए विचारों का उल्लेख $PYTHONPATH पर या साथ sys.path

अन्य उत्तर अजगर में खोल में पथ को संशोधित करने का उल्लेख है। पायथन से, मेरी लिपि में निम्नलिखित पंक्तियां जोड़ने से मुझे इसे क्रॉन से सीधे सफलतापूर्वक चलाने की अनुमति मिलती है।

import sys 
sys.path.insert(0,'/path/to/venv/lib/python3.3/site-packages'); 

यह इस प्रकार से एक इंटरैक्टिव सत्र में दिखाई देता है -

Python 3.3.2+ (default, Feb 28 2014, 00:52:16) 
[GCC 4.8.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 

>>> import sys 

>>> sys.path 
['', '/usr/lib/python3.3', '/usr/lib/python3.3/plat-x86_64-linux-gnu', '/usr/lib/python3.3/lib-dynload'] 

>>> import requests 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named 'requests' 

>>> sys.path.insert(0,'/path/to/venv/modules/'); 

>>> import requests 
>>> 
संबंधित मुद्दे