ক্রোন এবং ভ্যুচুয়ালেনভ


227

আমি ক্রোন থেকে জ্যাঙ্গো ম্যানেজমেন্ট কমান্ড চালানোর চেষ্টা করছি। আমি আমার প্রকল্পটি স্যান্ডবক্সযুক্ত রাখতে ভার্চুয়ালেনভ ব্যবহার করছি।

আমি এখানে এবং অন্য কোথাও উদাহরণগুলি দেখেছি যা ভার্চুয়ালেনভের মতো চলমান পরিচালনা কমান্ডগুলি দেখায়:

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

তবে, কাজটি শুরু হওয়ার আগে সিসলগ একটি এন্ট্রি দেখায়, এই টাস্কটি আসলে কখনও চালায় না (স্ক্রিপ্টের জন্য লগ ফাইলটি খালি রয়েছে)। আমি যদি শেল থেকে লাইনটি ম্যানুয়ালি চালাই তবে এটি প্রত্যাশার মতো কাজ করে।

ক্রোন দিয়ে চালানোর জন্য কমান্ডটি কেবলমাত্র পাওয়া যায়, তা হ'ল কমান্ডগুলি ভেঙে একটি বোবা বাশ র্যাপার স্ক্রিপ্টে রেখে দেওয়া:

#!/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

কমপক্ষে আমার ক্ষেত্রে, ভার্চুয়ালেনভের জন্য অ্যাক্টিভেট স্ক্রিপ্টটি চাওয়া কিছুই করেনি। এটি শো দিয়ে তাই কাজ করে।


একটি পার্থক্য যা আমি দেখছি তা হ'ল স্ক্রিপ্টটি বর্তমান ওয়ার্কিং ডিরেক্টরি হিসাবে / home / ব্যবহারকারী / প্রকল্পের সাথে ম্যানেজ.পি চালাবে run আপনার ক্রোন কমান্ডটি সিডাব্লুডির মতো আপনার হোম ডিরেক্টরিতে চালিত হবে। লগ ফাইল আছে কি?
পুনরুদ্ধার করুন

আসলে লগের পথটি একেবারে সংজ্ঞায়িত করা হয়, এটি কেবল তৈরি / সংযুক্ত থাকে না কারণ স্ক্রিপ্টটি চলমান না।
জন-স্কট

ক্রোন ইস্যুগুলির একটি দ্রুত এবং নোংরা সমাধান হ'ল আপনার পরিবেশটি (যাতে আপনার কমান্ডটি অবাস্তবভাবে কাজ করছে) envএবং exportসেগুলি সমস্ত আপনি যে কোনও ক্র্যাশট্যাব থেকে কল করেন তা বাশ স্ক্রিপ্টের মোড়কে ডাম্প করা ।
jberryman

উত্তর:


250

pythonআপনার ভার্চুয়াল পরিবেশে এটি ব্যবহার করে আপনার সক্ষম হওয়া উচিত :

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

সম্পাদনা: আপনার জ্যাঙ্গো প্রকল্পটি যদি পাইথনপথে না থাকে, তবে আপনাকে সঠিক ডিরেক্টরিতে স্যুইচ করতে হবে:

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

আরেকটি জিনিস চেষ্টা করে দেখুন আপনার manage.pyস্ক্রিপ্টে একেবারে শীর্ষে একই পরিবর্তন করা :

#!/home/my/virtual/bin/python

1
এটিও কাজ করে না। কাজ করে না এমন জিনিসগুলির তালিকায় এটি রাখতে ভুলে গেছি। হ্যাঁ, আমি সেই কমান্ডটি শেলটিতে ম্যানুয়ালি চালাতে পারি তবে এটি ক্রোন থেকে কার্যকর হয় না।
জন-স্কট

আপনি ~পুরো পথ দিয়ে প্রতিস্থাপন করেছেন? (আপনি সম্ভবত করেছেন,
সুনিশ্চিত করে দিয়েছিলেন

আহ, আপনি একটি কাজের উদাহরণ নিয়ে এসেছেন! আমি প্রতিটি সংমিশ্রণ সম্পর্কে চেষ্টা করেছি এবং ভার্চুয়ালেনভকে সক্রিয় করার ফলে কোনও প্রভাব নেই বলে মনে হচ্ছে। আমি আমার পাইথনপথটিকে .brcrc এ সেট করি তবে এটি দৃশ্যত ক্রোন ব্যবহার করে না? আপনার উত্তরটি হাইলাইট করতে আমার প্রশ্ন আপডেট করবে।
জন-স্কট

হ্যাঁ, আমি ভুলে গিয়েছিলাম যে ক্রোন খুব ন্যূনতম পরিবেশের মধ্যে চলে। সাধারণ সুপারিশটি হ'ল আপনার কাজের যে পরিবেশের প্রয়োজন হবে সেট আপ করতে বাশ স্ক্রিপ্টগুলি লিখুন। আপনি সরাসরি ক্রোনটিতে বাশ প্রোফাইলটি উত্সাহিত করার চেষ্টা করতে পারেন তবে এটি আপনার প্রোফাইলে কী রয়েছে তার উপর নির্ভর করে সূক্ষ্ম বাগগুলি নিয়ে যেতে পারে (সম্ভবত আপনার যদি এই জাতীয় প্রয়োজনের জন্য পৃথক এবং ন্যূনতম প্রোফাইল থাকে তবে তা ঠিক থাকবে)।
আর্স

7
পরীক্ষার একটি ভাল উপায় হ'ল / বিন / শি সম্পাদন করা এবং তারপরে সেখান থেকে আপনার আদেশটি কার্যকর করার চেষ্টা করুন। কমপক্ষে আপনার ক্রোন হিসাবে একই পরিবেশ সেটআপ থাকবে।
ডিক

98

sourceক্রোনফাইল থেকে চালানো ক্রোনকে /bin/shতার ডিফল্ট শেল হিসাবে ব্যবহার করবে না , যা সমর্থন করে না source। আপনাকে শেল পরিবেশ পরিবর্তনশীল হতে হবে /bin/bash:

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

এটি /var/log/syslogত্রুটির বিশদটি লগ করে না কেন এটি ব্যর্থ হয় তা স্পষ্ট করা মুশকিল। রুট থেকে নিজেকে উপনামের সেরা করুন যাতে আপনি কোনও ক্রোন ত্রুটি সহ ইমেল পান। কেবল নিজেকে যুক্ত করুন /etc/aliasesএবং চালান sendmail -bi

এখানে আরও তথ্য: http://codeinthehole.com/archives/43- রনিং- জাজানো- ক্রোনজবস- উইথিন- এ- ভার্চুয়ালেনভিএইচটিএমএল

উপরের লিঙ্কটি এতে পরিবর্তন করা হয়েছে: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/


12
বা '।' (ডট কমান্ড), যা / বিন / শ. /path/to/virtualenv/bin/activate
রিড সানডবার্গ

5
ডেভিড উইন্টারবটম, এটি যদি আপনার আসল নাম হয় তবে আপনি আমার নায়ক। Sh vs bash এবং উত্স ফাইলগুলি সম্পর্কে আমি কখনই জানতাম না। আপনি আমার ছোট বাশ-স্ক্রিপ্টিং ওয়ার্ল্ড ডুডের উপর আলোকপাত করেছেন। ধন্যবাদ।
joemurphy

আপনার যদি কোনও postactivateফাইল থাকে তবে আপনার করা উচিতsource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
dspacejs

1
ধন্যবাদ! আমার জন্য, এটি জেরাল্ডের গৃহীত উত্তরের চেয়ে কাজ করে।
মার্টিন বেকার

1
'রুট' কীসের জন্য? যে কেউ ব্যাখ্যা করতে পারে
আদনানমুতলেব 5'19

19

আর কোনও চেহারা না:

0 3 * * * /usr/bin/env bash -c 'cd /home/user/project && source /home/user/project/env/bin/activate && ./manage.py command arg' > /dev/null 2>&1

জেনেরিক পদ্ধতি:

* * * * * /usr/bin/env bash -c 'YOUR_COMMAND_HERE' > /dev/null 2>&1

এই সম্পর্কে সৌন্দর্য আপনি পরিবর্তন করতে দরকার নেই SHELLথেকে নিম্নলিখিতরূপে crontab পরিবর্তন জন্য পরিবর্তনশীল shথেকেbash


13

ভার্চুয়ালেনভ ব্যবহার করার সময় পাইথন ক্রোন কাজ চালানোর একমাত্র সঠিক উপায় হ'ল পরিবেশ সক্রিয় করা এবং তারপরে আপনার কোডটি চালানোর জন্য পরিবেশের অজগরটি কার্যকর করা।

এটি করার একটি উপায় হ'ল activate_thisআপনার অজগর স্ক্রিপ্টে ভার্চুয়ালেনভ ব্যবহার করুন , দেখুন: http://virtualenv.readthedocs.org/en/latest/userguide.html#used-virtualenv-without-bin-python

আরেকটি সমাধান হ'ল পরিবেশটি সক্রিয় করা এবং এটিতে পাইপ সহ সম্পূর্ণ কমান্ড প্রতিধ্বনি করা /bin/bash। আপনার জন্য এটি বিবেচনা করুন /etc/crontab:

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

1
আমি আসলেই একমাত্র সঠিক উপায় যে sensকমত্য আছে কিনা তা সম্পর্কে আমি খুব কৌতূহলী।
অ্যারন শুমাচার

1
এটি সম্ভবত একমাত্র সঠিক উপায়। কিন্তু অন্যান্য উপায় আছে যে কাজ করে।
উইল

4
এটি "একমাত্র সঠিক উপায়" নয়। আমি 'ভার্চুয়ালেনভের পাইথন বাইনারি, যেমন' / হোম / ইউজার / ফোল্ডার / এনভি / বিন / পাইথন 'এর মতো ক্রাউনজবকে সহজেই নির্দেশ করে একটি ভার্চুয়ালেনভের একটি স্ক্রিপ্ট সফলভাবে সম্পাদন করেছি। পরিবেশকে যাই হোক না কেন সক্রিয় করার প্রয়োজন নেই।
কানুকলস্যান্ডউইচ

আপনি যদি ভার্চুয়াল পরিবেশে কাস্টম পাইথনপথ ব্যবহার করেন env / bin / পাইথন আপনার পক্ষে কাজ করবে না। এজন্য
এনএভিভি

1
এটি নির্ভর করে যে আপনি কীভাবে পাইথনপথ সেট করেছেন এবং যদি আপনি এটি এমনভাবে সেট করেন যাতে ভেনভের "সক্রিয়করণ" প্রয়োজন হয় তবে আপনি এটি ভুল করছেন

10

ভার্চুয়ালেনভ-নির্দিষ্ট শেবাংগুলি নিয়ে ঘুরাঘুরি করার পরিবর্তে ক্রোনট্যাবের PATHউপর চাপ দিন।

অ্যাক্টিভেটেড ভার্চুয়ালেনভ থেকে, এই তিনটি কমান্ড চালনা করুন এবং পাইথন স্ক্রিপ্টগুলি কেবল কাজ করা উচিত:

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

ক্রন্টাবের প্রথম লাইনে এখন দেখতে এইরকম হওয়া উচিত:

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

12
ভাল সমাধান নয়। ক্রন্টাবের প্রতিটি অজগর কাজগুলি তখন ভার্চুয়ালেনভের বাইনারি দিয়ে চলত। এই বাইনারিটিকে সিউডো-গ্লোবাল অজগর তৈরি করা ভ্যুচুয়ালেনভের খুব লক্ষ্যের বিরুদ্ধে।
ভিক্টর শ্রদ্ধার

4

আমার পক্ষে সবচেয়ে ভাল সমাধান ছিল দুজনেরই

  • ভেন্টভ বিন / ডিরেক্টরিতে পাইথন বাইনারি ব্যবহার করুন
  • ভেন্ট মডিউল ডিরেক্টরি অন্তর্ভুক্ত করার জন্য পাইথন পাথ সেট করুন।

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
>>>

4

আমি এটি যুক্ত করতে চাই কারণ আমি সমস্যাটি সমাধান করতে কিছু সময় ব্যয় করেছি এবং ক্রোন এবং ভ্যুচুয়ালেনভের মধ্যে ভেরিয়েবল ব্যবহারের সংমিশ্রণের জন্য কোনও উত্তর এখানে পাইনি। সুতরাং এটি কাউকে সাহায্য করবে।

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DIR_SMTH="cd /smth"
VENV=". venv/bin/activate"
CMD="some_python_bin do_something"
# m h  dom mon dow   command
0 * * * * $DIR_SMTH && $VENV && $CMD -k2 some_target >> /tmp/crontest.log 2>&1

এটির মতো কনফিগার করা থাকলে এটি ভালভাবে কাজ করে না

ডিআইআরএসএমটিএইচ = "সিডি / স্মেথ && ভিনভ / বিন / অ্যাক্টিভেট"

ধন্যবাদ @davidwinterbottom , @ খাগড়া-Sandberg এবং @mkb ডান দিক দেবার জন্য। গৃহীত উত্তরটি আসলে ঠিকঠাক হয়ে যায় যতক্ষণ না আপনার অজগরকে একটি স্ক্রিপ্ট চালানোর প্রয়োজন হয় যা ভেন্ট / বিন ডিরেক্টরি থেকে অন্য পাইথন বাইনারি চালাতে হয়।


0

এটি এমন একটি সমাধান যা আমার পক্ষে ভালভাবে কাজ করেছে।

source /root/miniconda3/etc/profile.d/conda.sh && \
conda activate <your_env> && \
python <your_application> &

আমি একটি উবুন্টু 18.04.3 এলটিএসে কনডা সংস্করণ 4.7.12 সহ মিনিকোন্ডা ব্যবহার করছি।

আমি উপরেরটিকে কোনও স্ক্রিপ্টের ভিতরে রাখতে এবং ক্রোনট্যাবের মাধ্যমে কোনও ঝামেলা ছাড়াই চালাতে সক্ষম হয়েছি।


0

অজগর লিপি

from datetime import datetime                                                                                                                                                                
import boto   # check wheather its taking the virtualenv or not                                                                                                                                                                        
import sys                                                                                                                                                                                   
param1=sys.argv[1]     #Param                                                                                                                                                                                                                                                                                                                                                                    
myFile = open('appendtxt.txt', 'a')                                                                                                                                                      
myFile.write('\nAccessed on ' + param1+str(datetime.now())) 

ক্রোন কমান্ড

 */1 * * * *  cd /Workspace/testcron/ && /Workspace/testcron/venvcron/bin/python3  /Workspace/testcron/testcronwithparam.py param  

উপরের কমান্ডে

  • * / 1 * * * * - প্রতি এক মিনিট কার্যকর করুন
  • সিডি / ওয়ার্কস্পেস / টেস্টক্রন / - পাইথন স্ক্রিপ্টের পথ
  • / ওয়ার্কস্পেস / টেস্টক্রন / ভেন্টক্রন / বিন / পাইথন 3 - ভার্চুয়ালেনভ পথ
  • ওয়ার্কস্পেস / টেস্টক্রন / টেস্টক্রোনভিথপার্ম.পি - ফাইলের পথ path
  • প্যারাম - পরামিতি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.