首页 > 解决方案 > Django 任务未使用 crontab 运行

问题描述

我正在使用django-kronos创建一个 cron 作业,当我手动运行它时它运行良好。但在 crontab 的情况下它不会运行。

下面是我测试它是否工作的代码:

settings.py

ENV_PATH = os.path.join(BASE_DIR, '.env')

# Adding KRONOS PROPERTIES
KRONOS_PREFIX = '{} '.format(ENV_PATH)
KRONOS_POSTFIX = '>> /var/log/cron.log 2>&1'

.env我在文件中有我的密码。因此,我习惯于KRONOS_PREFIX先导出这些变量。KRONOS_POSTFIX用于将日志添加到我的 cron。

cron.py

import kronos

@kronos.register('* * * * *')
def test_task():
    print("IT WORKS....")

Commands:

$ python manage.py showtasks

* List of tasks registered in Kronos *
>> Kronos tasks
    >> test_task
>> Django tasks

$ python manage.py installtasks
1 task removed, 1 installed.

crontab -l

* * * * * /home/sam/..../.env  /home/sam/.../venv/bin/python /home/sam/.../manage.py runtask test_task  --settings=my_project.settings >> /var/log/cron.log 2>&1 # kronos:4f383ee5e8844285d6ac6dc78196e377

它在我crontab手动运行中提到的命令并记录输出时起作用。我在网上查了几篇文章都没有成功。

我发现这篇digitalocean 文章有些相似,但这在我的情况下也不起作用。

任何帮助深表感谢。

谢谢。

标签: python-3.xcronubuntu-18.04django-1.11django-kronos

解决方案


在检查了几篇文章几个小时并调试后,我发现主要问题是source .env我使用的。crontab 无法使用该命令导出环境变量。所以,我决定创建另一个文件,名称.env_constants和更新KRONOS_PREFIX如下:

settings.py

KRONOS_PREFIX = 'env - `cat {}` '.format(os.path.join(BASE_DIR, '.env_constants'))

.env_constants

DB_NAME=db_name
DB_USER=db_user
DB_PASSWORD=db_password
DB_HOST=localhost
DB_PORT=port_no

我的 cron 现在看起来像:

* * * * * env - `cat /home/sam/.../.env_constants`  /home/sam/.../venv/bin/python /home/sam/.../manage.py runtask test_task  --settings=my_project.settings >> /var/log/cron.log 2>&1 # kronos:4f383ee5e8844285d6ac6dc78196e377

现在它运行良好。


推荐阅读