0

希望我能得到一些关于 django crontab 的指导。

我有以下设置:在settings.py中:

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

#other settings not related to crontab

CRONJOBS = [
    ('*/1 * * * * ', 'my_app.cron.cronjob')
]

在我的 my_app/cron.py 中(现在我有一个名为“name”的模型):

def cronjob():
    total_ref = models.Count.objects.get(name='name')
    total_ref.total += 1
    total_ref.save()
    return()

在我的 my_app/models.py 中:

class Count(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True)
    total = models.IntegerField(blank=True, null=True)
    def __str__(self):
        return self.name

当我运行以下命令时:

$ python manage.py crontab add
crontab: no crontab for user
  adding cronjob: (26ea74b6ee863259e86bcab90f96ec1a) -> ('*/1 * * * * ', 'ms_app.cron.switch_count')

当我检查它是否在我的 crontab 中时

$ crontab -l
*/1 * * * *  /Path_to_env/bin/python /Path_to_my_app/my_project/manage.py crontab run 26ea74b6ee863259e86bcab90f96ec1a # django-cronjobs for myl_project

我正在使用 Django 3.2.5 和 django_crontab 0.7.1 运行 python 3.8.2

检查完所有这些后,当我去检查模型条目(总计)时,我仍然没有得到任何更改

4

1 回答 1

0

问题不在于我的代码,我需要做的是将我的 cron 添加到全盘访问。按照这个链接

以下是问题和解决方案的摘录:

问题

熟悉类 UNIX 系统的人可能知道 cron,这是一个设计精良的小型作业调度程序,安装在所有 macOS 系统和大多数 Linux 发行版中。

Cron 允许您为作业执行设置基于时间的规则,以便您可以自动执行备份、健康检查、设置安全文件权限等操作。

随着 Mojave 的访问控制机制的引入,cron 作业不能再访问某些目录,因为它们包含敏感数据,但是当我们的 cron 作业处理这些数据时会发生什么?

修复

Mojave 让您将应用程序和二进制文件添加到“全盘访问”白名单,所以让我们看看哪个二进制文件运行我的 cron 作业:

$ ps aux | grep cron
root            201  0.0  0.0  4295936  1188  ??  Ss  11:50PM  0:00.31 /usr/sbin/cron

在这里,我们看到运行系统 cron 作业的二进制文件是/usr/sbin/cron.

授予对 cron 的全盘访问权限

  • System Preferences > Security & Privacy > Privacy > Full Disk Access

  • 打开系统设置,转到安全和隐私部分,在隐私选项卡上,单击全盘访问项

  • 单击(+) 图标将项目添加到列表中

  • command+shift+G打开“转到文件夹...”对话框,键入/usr/sbin/cron并按 Enter:打开“转到文件夹”对话框并搜索/usr/sbin

  • 选择 cron 文件并单击打开:选择/usr/sbin/cron

而已!现在我的脚本可以访问我用户的$HOME/Library文件夹及其所有内容!点击确定

使用上述内容也有警告:

警告:这在安全方面不是一个好主意,如果恶意行为者可以创建 cron 作业或编辑作为 cron 作业运行的脚本,他或她也将拥有全磁盘访问权限。手动或使用诸如KnockKnock之类的工具监视系统安装的 cron 作业并谨慎操作。

于 2021-10-07T12:20:27.250 回答