克朗和virtualenv

我试图从cron运行Djangopipe理命令。 我正在使用virtualenv保持我的项目沙箱。

我在这里和其他地方看到了一些示例,显示了从virtualenv中运行pipe理命令的过程:

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

但是,即使syslog在任务启动时显示一个条目,该任务也不会实际运行(脚本的日志文件为空)。 如果我从shell手动运行该行,它按预期工作。

我现在可以通过cron运行命令的唯一方法是将命令分解并放在一个笨笨的bash包装器脚本中:

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

至less在我的情况下,调用virtualenv的激活脚本什么也没做。 这个工程,等等。

你应该可以通过在你的虚拟环境中使用python来做到这一点:

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

编辑:如果你的django项目不在PYTHONPATH中,那么你需要切换到正确的目录:

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

您也可以尝试从cronlogin失败:

 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 

从cronfile运行source将不起作用,因为cron使用/bin/sh作为其缺省shell,不支持source 。 您需要将SHELL环境variables设置为/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不会logging错误信息。 最好将自己别名为root,以便通过任何cron错误发送邮件。 只需将自己添加到/etc/aliases并运行sendmail -bi

更多信息: http : //codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

而不是用virtualenv特定的shebangs,只是把PATH放在crontab上。

从激活的virtualenv,运行这三个命令和Python脚本应该只是工作:

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

crontab的第一行现在应该是这样的:

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

使用virtualenv运行python cron作业的唯一正确方法是激活环境,然后执行环境的python来运行代码。

一种方法是在您的python脚本中使用virtualenv的activate_this ,请参阅: http : //virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-python

另一个解决scheme是回应完整的命令,包括激活环境并将其input/bin/bash 。 考虑一下你的/etc/crontab

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

对我来说最好的解决办法就是两者兼顾

  • 使用venv bin /目录中的python二进制文件
  • 设置pythonpath来包含venv modules目录。

man python提到在$PYTHONPATH shell中修改path,或者在sys.path中修改man python的path

其他答案提到使用shell来做这个的想法。 从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 >>>