我正在使用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 article有点相似,但在我的情况下也不起作用。
非常感谢您的帮助。
谢谢。
[在检查了几篇文章几个小时并进行调试后,我发现主要问题是我使用的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
现在运行正常。