小能豆

无法使用 Django-cron 进行函数调用

py

我不确定它是如何工作的,但让我解释一下我做了什么。我需要调用下面文件夹结构中提到的方法。

proj_application
|
|- myapp
       |
       |-views.py (Method call Inside)
                |- poll_tracked()

在views.py中,

def poll_tracked():
    print('called')

在 settings.py 中我提到过

INSTALLED_APPS = [
'django_crontab',
]

CRONJOBS = [
    ('* * * * *', 'myapp.views.poll_tracked', '>>' + os.path.join(BASE_DIR, 'data.log'))
]

然后我运行

python3.7 manage.py crontab add
python3.7 manage.py runserver

当我运行 crontab -l 时,我可以看到,

* * * * * /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/domain/dashboard/proj_application/manage.py crontab run dceca84af9ceab8a4d39d08fa148969f >>/Users/domain/dashboard/proj_application/data.log # django-cronjobs for proj_application

生成了一个名为 data.log 的新日志文件,但是没有调用提到的 poll_tracked() 方法,并且日志为空。

有人遇到过这个问题吗?如果有,任何帮助我都会很感激。谢谢。


阅读 5

收藏
2025-01-13

共1个答案

小能豆

你的问题看起来和 django-crontab 的配置或运行环境有关。以下是一些可能导致问题的原因及解决方案:


1. 确认 poll_tracked() 函数是否正确导入

确保 CRONJOBS 中的 myapp.views.poll_tracked 可以被正确解析。你可以通过以下方式测试:

python3.7 manage.py shell

然后在 Django shell 中运行:

from myapp.views import poll_tracked
poll_tracked()

如果没有任何错误并输出 'called',那么导入是正确的;否则,需要检查 views.py 的路径或模块名称。


2. 检查 django-crontab 是否正确安装

确认 django-crontab 是否正确安装并可用:

pip show django-crontab

如果没有安装,运行以下命令安装:

pip install django-crontab

然后再次尝试运行 python3.7 manage.py crontab add


3. 检查是否使用正确的 Python 解释器

运行的 python3.7 manage.py crontab add 和 Crontab 配置中使用的 Python 解释器路径是否一致。

你可以通过以下命令检查 Crontab 中的 Python 解释器路径是否正确:

which python3.7

确保与 Crontab 中的路径 /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 一致。


4. 检查权限问题

确保 Crontab 有权限写入日志文件。日志文件的路径 '/Users/domain/dashboard/proj_application/data.log' 必须对运行 Crontab 的用户可写。

可以运行以下命令检查文件权限:

ls -l /Users/domain/dashboard/proj_application/data.log

如果权限不足,可以使用以下命令更改权限:

chmod 666 /Users/domain/dashboard/proj_application/data.log

5. 测试 Crontab 配置

你可以手动运行 Crontab 中生成的命令,验证其是否工作。例如,运行:

/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/domain/dashboard/proj_application/manage.py crontab run dceca84af9ceab8a4d39d08fa148969f

这应该调用 poll_tracked() 并打印 called


6. 验证 Cron 服务是否运行

确认你的操作系统的 Cron 服务已启用。运行以下命令检查:

sudo service cron status

如果未启用,启动 Cron 服务:

sudo service cron start

7. 调试 Cron 的问题

将 Cron 的错误输出重定向到另一个日志文件以进行调试:

CRONJOBS = [
    ('* * * * *', 'myapp.views.poll_tracked', '>>' + os.path.join(BASE_DIR, 'data.log') + ' 2>>' + os.path.join(BASE_DIR, 'error.log'))
]

检查 error.log 文件中是否有任何错误提示。


8. Django 环境配置问题

如果 poll_tracked 方法依赖于 Django 环境变量(如数据库连接或设置文件),确保 Cron 作业执行时加载了 Django 设置。你可以显式指定 DJANGO_SETTINGS_MODULE

export DJANGO_SETTINGS_MODULE=proj_application.settings

在 Cron 作业中也可以手动指定:

* * * * * DJANGO_SETTINGS_MODULE=proj_application.settings /Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 /Users/domain/dashboard/proj_application/manage.py crontab run dceca84af9ceab8a4d39d08fa148969f >> /Users/domain/dashboard/proj_application/data.log

总结

按照上述步骤逐一检查问题,尤其是:
- 确认 poll_tracked() 是否正确被导入。
- 检查 Crontab 是否可以运行对应的命令。
- 验证日志文件是否有写入权限。
- 确保 Cron 服务正在运行。

完成这些步骤后,应该能够成功调用 poll_tracked() 方法并记录日志。

2025-01-13