+-
python – Django管理命令在cron中不起作用
我在用我的用户crontab调度一个manage.py芹菜调用myapp.tasks.mytask时遇到了问题,因为当cron尝试运行这个作业时,它会在stderr中得到这个(它被邮寄给我,作为/ var / mail / kal )

Unknown command: 'celery' Type 'manage.py help' for usage.

相同的命令完全来自常规的bash登录shell,但它在crontab中不起作用.

我在Debian上这样做:

$lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 7.0 (wheezy) Release: 7.0 Codename: wheezy

我已经在StackOverflow上阅读了许多类似的问题,并尝试了许多建议的解决方案.到目前为止,他们都没有为我工作过.以下是我到目前为止尝试过的解决方案:

首先,我确保在crontab中指定相关的环境变量:

SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

注意:这些在以下所有解决方案中都保持不变.

1.使用python可执行文件和manage.py脚本的完整路径

* * * * * /home/kal/.virtualenvs/foo_dev/bin/python /home/kal/foo/manage.py celery call myapp.tasks.mytask

2.首先进入项目路径

* * * * * cd /home/kal/foo && /home/kal/.virtualenvs/foo_dev/bin/python ./manage.py celery call myapp.tasks.mytask

3.在bash脚本中包装所有内容

〜/ mytask.sh的内容:

#!/usr/bin/env bash source /home/kal/.virtualenvs/foo_dev/bin/activate; cd /home/kal/foo; ./manage.py celery call myapp.tasks.mytask;

crontab行:

* * * * * ~/mytask.sh

我甚至修改了myproj / settings.py来输出sys.path和sys.executable到stderr,并比较了cron和登录shell之间的输出,它们完全相同:

来自cron作业的输出:

sys.executable: /home/kal/.virtualenvs/foo_dev/bin/python Content of sys.path: /home/kal/foo /home/kal/.virtualenvs/foo_dev/src/bootstrap /home/kal/.virtualenvs/foo_dev/src/django-json-rpc /home/kal/.virtualenvs/foo_dev/lib/python2.7 /home/kal/.virtualenvs/foo_dev/lib/python2.7/plat-linux2 /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-old /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-dynload /usr/lib/python2.7 /usr/lib/python2.7/plat-linux2 /usr/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/local/lib/python2.7/site-packages /home/kal/foo

Bash登录shell的输出:

sys.executable: /home/kal/.virtualenvs/foo_dev/bin/python Content of sys.path: /home/kal/foo /home/kal/.virtualenvs/foo_dev/src/bootstrap /home/kal/.virtualenvs/foo_dev/src/django-json-rpc /home/kal/.virtualenvs/foo_dev/lib/python2.7 /home/kal/.virtualenvs/foo_dev/lib/python2.7/plat-linux2 /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-old /home/kal/.virtualenvs/foo_dev/lib/python2.7/lib-dynload /usr/lib/python2.7 /usr/lib/python2.7/plat-linux2 /usr/lib/python2.7/lib-tk /home/kal/.virtualenvs/foo_dev/local/lib/python2.7/site-packages /home/kal/foo

我完全不知所措.

最佳答案
我找到了问题的原因.

这非常微妙.

问题有两个:

> cron作业中没有USER环境变量;只有LOGNAME;
>当使用指定的管理命令运行manage.py时,如果在导入设置模块期间引发异常,Django会悄悄地故障转移到空白设置.

我的设置模块试图引用os.environ [‘USER’],这在cron的环境中不存在.因此,导入设置模块会引发异常,并且Django会悄悄地故障转移到空白设置,这意味着空白INSTALLED_APPS并且没有celery命令!

点击查看更多相关文章

转载注明原文:python – Django管理命令在cron中不起作用 - 乐贴网