IT이야기

크론 앤 버추얼엔브

cyworld 2022. 3. 27. 14:24
반응형

크론 앤 버추얼엔브

크론에서 장고 관리 명령을 실행하려고 한다.나는 내 프로젝트를 샌드박스로 유지하기 위해 virtualenv를 사용하고 있다.

가상 환경 내에서 실행 중인 관리 명령을 보여주는 예는 다음과 같다.

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

그러나 syslog에 작업이 시작되었어야 하는 항목이 표시되더라도 이 태스크는 실제로 실행되지 않는다(스크립트의 로그 파일이 비어 있음).쉘에서 수동으로 라인을 가동하면 예상대로 동작한다.

cron을 통해 실행할 명령을 얻을 수 있는 유일한 방법은 명령을 해체하여 멍청한 bash wrapper 스크립트에 넣는 것이다.

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

편집:

ars는 다음과 같은 명령어 조합을 생각해냈다.

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

적어도 나의 경우 가상 환경 활성화 스크립트를 호출한 것은 아무 소용이 없었다.이 정도면 쇼가 잘 되잖아.

당신은 이 일을 할 수 있어야 한다.python가상 환경에서:

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

편집: django 프로젝트가 PYSONPATH에 없는 경우 올바른 디렉토리로 전환하십시오.

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

cron에서 오류를 기록할 수도 있다.

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

달리기source은 크론파일을 크론파일로 부터. 크론파일로 부터. 크론파일로 부터가./bin/sh로는 지만 지만 지만 지만 지만 지만 지만 지만 지사를 지지하지 않는 기지로서이다.source를 CHELL로 해야 한다. CHELL 환변수수수수수수정정./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-Running-django-cronjobs-within-a-virtualenv.html를 참조하십시오.

위의 링크가 https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/으로 변경됨:

더 이상 보지 마십시오.

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다음에서 크론타브의 변수shbash

virtualenv를 사용할 때 python cron 작업을 실행하는 유일한 올바른 방법은 환경을 활성화한 다음 환경의 python을 실행하여 코드를 실행하는 것이다.

이를 위한 한 가지 방법은 가상 환경(virtualenv)를 사용하는 것이다.activate_thispython 스크립트에서 http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python을 참조하십시오.

또 다른 해결책은 환경을 활성화하고 환경에 파이핑하는 것을 포함한 전체 명령을 반향하는 것이다./bin/bash. 이 점을 고려해 보십시오./etc/crontab:

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

가상 환경 특유의 쉐뱅으로 빈둥빈둥 돌아다니기보다는 미리 준비해라.PATH크론타브에.

활성화된 virtualenv에서 다음 세 가지 명령을 실행하면 python 스크립트가 작동하게 된다.

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

크론탑의 첫 줄은 이제 다음과 같아야 한다.

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

그 n번째 답은 미안한데 내가 확인해 봤는데 정말 간단하고 더 깔끔해.

장편단기

크론에서 venv의 python 이진법 사용:

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

장편 이야기

특정 가상 환경의 파이선 구성(즉, 바이너리와 모듈)으로 현재 셸을 설정하고 싶을 때 가상 환경을 활성화한다.
그것은 현재 셸로 작업하는 것과 관련이 있다: venv의 전체 python 경로를 참조할 필요 없이 현재 셸에서 여러 개의 python 명령을 실행한다.
환경을 활성화할 가치가 있는 크론이나 바시의 틀에서 ? 게다가 나는 몇몇 대답에서 언급된 것을 읽었다.bashsh또는 Python 코드를 호출할 래퍼를 정의해야 한다.그런데 도대체 왜 우리가 이것들을 가지고 신경써야 하는가?

반복한다, 그냥 해.

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

문서에서는 다음을 검증한다.

특정 환경을 활성화할 필요는 없으며, 활성화는 가상 환경의 바이너리 디렉토리를 경로에 추가하기만 하면 "피톤"은 가상 환경의 Python 통역기를 호출하고 전체 경로를 사용하지 않고도 설치된 스크립트를 실행할 수 있다.그러나 가상 환경에 설치된 모든 스크립트는 활성화하지 않고 실행할 수 있어야 하며, 가상 환경의 Python으로 자동으로 실행되어야 한다.

나에게 가장 좋은 해결책은 둘 다였다.

  • venv bin/ 디렉토리에서 python 이진 사용
  • venv 모듈 디렉토리를 포함하도록 python 경로를 설정하십시오.

man python로 길을 한 것에 언급한다.$PYTHONPATH또는 와 싸워서.sys.path

다른 답변들은 껍데기를 이용해서 이것을 하는 아이디어를 언급한다.python에서, 내 스크립트에 다음 줄을 추가하면 cron에서 직접 실행할 수 있다.

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

나는 문제를 해결하는 데 시간이 좀 걸렸고 여기서 크론(cron)과 가상(virtualenv)의 변수 사용의 조합에 대한 답을 찾지 못했기 때문에 이것을 덧붙이고자 한다.그래서 아마 누군가에게 도움이 될 것이다.

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

이렇게 구성했을 때는 잘 되지 않았다.

DIR_SMTH="cd /smth &&. venv/bin/activate"

@davidwinterbottom, @reed-sandberg, @mkb 올바른 방향 제시해줘서 고마워.수용된 답은 실제로 당신의 python이 venv/bin 디렉토리에서 다른 python 바이너리를 실행해야 하는 스크립트를 실행해야 할 때까지 잘 작동한다.

이것은 crontab 명령을 일반 명령어(우분투 18.04에서 시험)와 매우 유사하게 유지하는 간단한 방법이다.명심해야 할 몇 가지 주요 참고 사항:

  • 당신은 그것을 사용할 수 있다..대신 명령하다source. (크론타브 사용)sh아닌 채무불이행으로bash, 그래서 그것은 가지고 있지 않다.source.)
  • ~그리고$variablescrontab 명령으로 확장된다.(변수확장을 하지 않는 것은 크론타브 환경문장뿐입니다.)

파일이 있는 경우 다음 예제를 참조하십시오.~/myproject/main.py:

* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1

특정 경로에 직접 전화를 걸 수도 있다.pythonvenv 디렉토리에서, 그러면 당신은 전화할 필요가 없다.activate.

* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1

단점은 프로젝트 경로를 두 번 지정해야 한다는 것이며, 이로 인해 유지보수가 더욱 까다로워진다는 것이다.이를 방지하려면 셸 변수를 사용하여 프로젝트 경로를 한 번만 지정하십시오.

* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1

만약 당신이 python을 사용하고 있고 당신의 python 스크립트에 shebang #!/usr/bin/envenv python이 포함되어 있는 Conda Virtual Environment를 사용하고 있다면 다음과 같은 작업을 한다.

* * * * * cd /home/user/project && /home/user/anaconda3/envs/envname/bin/python script.py 2>&1

또한 스크립트에 출력(예: 인쇄, 오류 등)을 캡처하려면 다음을 사용하십시오.

* * * * * cd /home/user/project && /home/user/anaconda3/envs/envname/bin/python script.py >> /home/user/folder/script_name.log 2>&1

비단뱀 문자

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 * * * - 모든 minte 실행
  • cd /Workspace/testcron/ - path of python 스크립트
  • /Workspace/testcron/venvcron/bin/python3 - Virtualenv 경로
  • 작업영역/testcron/testcronwithparam.py - 파일 경로
  • 매개 변수 - 매개 변수

다음과 같은 스크립트를 다음과 같이 추가했다.manage.sh나의 장고 프로젝트 안에 가상의 엔비젼을 소스로 하고 그리고 나서 그것을 실행한다.manage.py어떤어 줘. 할 수 일반적으로 virtualenv 내부(cron, systemd units, 기본적으로 어디에서나)에서 명령을 실행하는 것이 매우 용이하다.

#! /bin/bash

# this is a convenience script that first sources the venv (assumed to be in
# ../venv) and then executes manage.py with whatever arguments you supply the
# script with. this is useful if you need to execute the manage.py from
# somewhere where the venv isn't sourced (e.g. system scripts)

# get the script's location
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

# source venv <- UPDATE THE PATH HERE WITH YOUR VENV's PATH
source $DIR/../venv/bin/activate

# run manage.py script
$DIR/manage.py "$@"

그런 다음 크론 입력에서 다음을 실행하십시오.

0 3 * * * /home/user/project/manage.sh command arg

그냥 명심해, 넌 그 일을 해야 해manage.sh스크립트 실행 파일

크론(cron)은 최소로 실행되기 때문에sh환경, 가상 환경에서 Python 스크립트를 실행하려면 다음과 같이 하십시오.

* * * * * . ~/.bash_profile; . ~/path/to/venv/bin/activate; python ~/path/to/script.py

(hyough: if). ~/.bash_profile너한테는 안 통한다, 그럼 해봐.. ~/.bashrc또는. ~/.profile서버 설정 방법에 따라 달라짐)

이것은 너의 짐을 싣는다.bash그런 다음 Python 가상 환경을 활성화하여 스크립트를 테스트한 동일한 설정을 그대로 유지하십시오.

crontab에서 환경 변수를 정의할 필요가 없으며 기존 스크립트를 수정할 필요가 없다.

이것은 나에게 잘된 해결책이다.

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

나는 Ubuntu 18.04.3 LTS에서 콘다 버전 4.7.12와 함께 미니콘다를 사용하고 있다.

위의 내용을 스크립트 안에 넣고 크론탑을 통해 문제없이 실행할 수 있다.

이것은 crontab -e에도 효과가 있을 것이다.

* */5 * * * cd /home/project && sudo /home/project/venv/bin/python scripte.py

나도 같은 문제가 있었어

Geodjango 폴리곤 내부에 Geodjango 위치 좌표를 확인하기 위해 사용자 정의 django 명령을 작성했으며 실행할 작업을 자동화하는 데 문제가 있었지만 crontab과 함께 이 명령을 사용하는 것이 내게는 다음과 같은 도움이 되었다.

* * * * * ./home/project/locations/locations.sh >> /var/log/locations.log 2>&1

참조URL: https://stackoverflow.com/questions/3287038/cron-and-virtualenv

반응형