0

我在 windows10 本地开发中,我不能在开发服务器中使用 cron am 测试。

我的工作基地命令

from api.models import EnrolmentUniquePattern
from django.core.management.base import BaseCommand
import datetime
from django.utils.timezone import get_current_timezone

class Command(BaseCommand):
    
    help = 'Expires enrolment unique pattern objects which are out-of-date'

    def handle(self, *args, **options):
        print(EnrolmentUniquePattern.objects.filter(
            expiration_date__lt=datetime.datetime.now(get_current_timezone())).delete())

我试图在 ubuntu 16.04 服务器中设置 django-crontab 并遇到一些问题。

pip install django-crontab

将它放在我安装的应用程序和 requirements.txt 中

INSTALLED_APPS = [
 ...
 'django_crontab',
 ...
]

在扩展 base_settings.py 的 development.py 设置中有 cronjobs:仅尝试测试我已经通过命令测试过的作业

CRONJOBS = [
    ('* * * * *', 'proregattaapi.cron.my_cron_job', '>> /var/log/django_cron_job.log'),
]

cron.py:

from datetime import datetime

from django.utils.timezone import get_current_timezone
from api.models import EnrolmentUniquePattern


def my_cron_job():
    print('my_cron_test')
    EnrolmentUniquePattern.objects.filter(
        expiration_date__lt=datetime.datetime.now(get_current_timezone())).delete()

然后推送到数字海洋托管的服务器上。

SSH 进入服务器,激活虚拟环境并进行调用:

python manage.py crontab add
python manage.py crontab show
python manage.py crontab run 3a55bd7591de350aa5d5d7be7758f17c

在上面,使用 crontab run 命令确认作业正在运行。删除具有上述过期日期时间的模型的工作是否完成

但是当我这样做时:

python manage.py runserver

或离开主管运行开发服务器

作业没有开始或记录任何内容

然后我看了看:

crontab -e

输出是:

* * * * * /root/.python-virtual-environments/proregatta-django-development-new-virtualenv/bin/python 
/var/www/development.proregatta.com/manage.py crontab run 3a55bd7591de350aa5d5d7be7758f17c >> /var/log/django_cron_job.log # django-cronjobs for proregattaapi

根据我有限的知识,我认为 crontab 做了以下事情:安装 django crontab 并在正在运行的项目中运行就足够了。

我没有在 cron 运行之前激活 virtualenv 吗?

我错过了什么?

先感谢您!

更新:

CRONJOBS = [
    ('*/1 * * * *', 'proregattaapi.cron.my_cron_job', '>> /var/log/django_cron_job_test.log 2>&1 '),
]

开始输出打印:

print('my_cron_test') # line to /var/log/django_cron_job_test.log

但不执行删除调用。

有什么建议吗?

但是当我强制运行作业时会调用删除对象..

不同的实现

无法使用 django-crontab 做到这一点。所以创建了一个基本相同的 .sh 脚本。

这是我的上下文工作的脚本:

#!/bin/bash
#chmod a+rx clean-expired-tokens.sh run when edited
cd ~/.python-virtual-environments/proregatta-django-development-new-virtualenv/bin
source activate
cd /var/www/development.proregatta.com/
python manage.py check_enrolment_unique_pattern_expiration --settings=proregattaapi.settings.development
deactivate

启用此文件的执行后:打开:

crontab -e

编辑为每周周日运行一次,并登录到该文件:

0 0 * * 0 /root/clean-expired-tokens.sh >> /var/log/django_cron_job_test.log 2>&1

这就是我现在要做的。

据我了解(django-crontab)正在检测调用其python的虚拟环境并尝试运行命令,但不知何故它没有在venv中运行。

4

0 回答 0