Kal*_*Kal 5 python django cron
我在manage.py celery call myapp.tasks.mytask
使用我的用户crontab 调度时遇到问题,因为当cron尝试运行该作业时,它会在stderr中获取此信息(将其邮寄给我,如/var/mail/kal
)
Unknown command: 'celery'
Type 'manage.py help' for usage.
Run Code Online (Sandbox Code Playgroud)
相同的命令完全来自常规的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
Run Code Online (Sandbox Code Playgroud)
我已经在StackOverflow上阅读了许多类似的问题,并尝试了许多建议的解决方案.到目前为止,他们都没有为我工作过.以下是我到目前为止尝试过的解决方案:
首先,我确保在crontab中指定相关的环境变量:
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Run Code Online (Sandbox Code Playgroud)
注意:这些在以下所有解决方案中都保持不变.
* * * * * /home/kal/.virtualenvs/foo_dev/bin/python /home/kal/foo/manage.py celery call myapp.tasks.mytask
Run Code Online (Sandbox Code Playgroud)
* * * * * cd /home/kal/foo && /home/kal/.virtualenvs/foo_dev/bin/python ./manage.py celery call myapp.tasks.mytask
Run Code Online (Sandbox Code Playgroud)
〜/ 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;
Run Code Online (Sandbox Code Playgroud)
crontab行:
* * * * * ~/mytask.sh
Run Code Online (Sandbox Code Playgroud)
我甚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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我完全不知所措.
我找到了问题的原因。
这是非常 非常微妙的。
问题有两个方面:
USER
cron 作业中没有环境变量;仅有的LOGNAME
;manage.py
运行时,如果在导入设置模块期间引发异常,Django会悄悄地故障转移到空白设置。我的设置模块试图引用os.environ['USER']
cron 环境中不存在的 。因此,导入设置模块会导致引发异常,并且 Django 会悄悄地故障转移到空白设置,这意味着空白INSTALLED_APPS
且没有celery
命令!