+-
我在用我的用户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.mytask2.首先进入项目路径
* * * * * cd /home/kal/foo && /home/kal/.virtualenvs/foo_dev/bin/python ./manage.py celery call myapp.tasks.mytask3.在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/fooBash登录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中不起作用 - 乐贴网