使用django_crontab包调度管理命令



最终,管理命令将用于每周一次的抓取数据和填充数据库,但目前我只是尝试按计划打印。以下是管理命令(位于player/management/commands/update_data.py(:

from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, *args, **options):
print('This is working')

现在进入日程安排部分。。。我运行

python3 -m pip install django-crontab

settings.py中添加以下内容:

INSTALLED_APPS = [
'django_crontab',
'player',
]
CRONJOBS = [
('*/1 * * * * ', 'django.core.management.update_data'),# I believe what I am saying here is run update_data every minute? 
] 

最后是

python manage.py crontab add

返回

adding cronjob: (1be0bb6367b686fd03a204d920284ed3) -> ('*/1 * * * * ',
'django.core.management.update_data')

然后我等了一分钟;这是有效的";从未打印到控制台。如果有人熟悉这个django-crontab(https://pypi.org/project/django-crontab/)包或知道调度管理命令的另一种方法,将不胜感激。提前谢谢。

我知道这个问题很久以前就发布了,但我遇到了非常类似的情况,在StackOverflow上找不到解决方案,所以我决定在这里发布我的解决方案。

在macOS Ventura 13.4上,我解决了这个问题的方法是在完成了您提到的所有步骤后,授予cron完全磁盘访问权限。要执行此操作,请转到系统首选项->安全性&隐私->隐私->完全磁盘访问并将cron添加到列表中。Cron应该位于/usr/sbin/Cron中。

此外,我的cronjob有点不同,因为我使用了一种不同的语法,django-crontab文档中也提到了这种语法。(https://pypi.org/project/django-crontab/)我的是这样的:

CRONJOBS = [
('*/1 * * * *', 'django.core.management.call_command', ['update_data'])]

这里,app_name/management/commands/update_data.py是管理命令,就像在您的项目中一样。

希望这能帮助下一个遇到问题的穷人。

我自己的cron作业也遇到了类似的问题,该作业通过shell脚本定期记录我的IP地址。使用Apple的迁移工具,该任务在3代Mac电脑上进行了传播,并保持了功能。仅在Ventura下,它不再工作,尽管它仍在下列出

crontab -l

除此之外,我想提到的是,不仅cron服务本身必须具有完整磁盘访问权限,而且很可能还有应该调用的作业。这有点奇怪,因为手动调用shell作业是可行的,但从cron调用时就不行了。

由于cron在2016年被苹果公司弃用(https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html),我将常规任务更改为launchd。这几乎更容易,运行也更好,因为当任务更改时会显示一条消息,这样您就可以更好地了解后台发生的事情。仍然需要向定期运行的作业授予完全磁盘访问权限。

当我想把这个问题作为自己的问题发布的时候,我找到了Orerez的答案。(两个答案都没有具体提到django,因此可能有一些额外的标签可能有助于找到这个答案。(

最新更新