gpt4 book ai didi

python - Django 管理命令在 cron 中不起作用

转载 作者:行者123 更新时间:2023-12-04 19:07:43 25 4
gpt4 key购买 nike

我在安排 manage.py celery call myapp.tasks.mytask 时遇到问题使用我的用户 crontab,因为当 cron 尝试运行该作业时,它会在 stderr 中得到它(它被邮寄给我,如 /var/mail/kal )

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

相同的命令在常规的 bash 登录 shell 中完全有效,但在 crontab 中无效。

我在 Debian wheezy 上这样做:
$ 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到项目路径
* * * * * 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.pathsys.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

我完全感到困惑。

最佳答案

我找到了问题的原因。

非常微妙的。

问题有两个方面:

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

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

    关于python - Django 管理命令在 cron 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20534923/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com