我在 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中运行。