【问题标题】:django_crontab is adding my jobs, but they don't seem to execute. Any solution?django_crontab 正在添加我的工作,但它们似乎没有执行。有什么解决办法吗?
【发布时间】:2021-07-24 14:48:47
【问题描述】:

我在 Ubuntu 20 上使用 django-crontab (github) 运行了一个 django 项目。

在 目录中我添加了一个 cron.py 文件:

from .models import <my_model>
from datetime import datetime


def remove_stamps():
    for stamp in <my_model>.objects.order_by('-stop_date'):
        if stamp.can_be_removed():
            stamp.delete()
        else:
            break


def close_stamps():
    for stamp in <my_model>.objects.filter(stop_date=None):
        stamp.stop_date = datetime.now()
        stamp.save()

在设置中:

CRONJOBS = [
('*/4 * * * *', '<my_django_app>.cron.remove_stamps'),
...
]

CRONTAB_LOCK_JOBS = True

我将项目部署如下:

首先使用@root 在命令行中创建一个 ,如下所示:

adduser --system --home=/var/opt/<project_name> --no-create-home --disabled-password --group --shell=/bin/bash <new_user>

使用 Nginx 我使用这个 运行虚拟环境,使用 gunicorn 像这样:

    [Unit]
         Description=<project_name>
    [Service]
         User=<new_user>
         Group=<new_user>
         Environment="PYTHONPATH=/etc/opt/<project_name>:/opt/<project_name>"
         Environment="DJANGO_SETTINGS_MODULE=settings"
         ExecStart=/opt/<project_name>/venv/bin/gunicorn \
           --workers=4 \
           --log-file=/var/log/<project_name>/gunicorn.log \
           --bind=127.0.0.1:8000 --bind=[::1]:8000 \
           <project_name>.wsgi:application
    [Install]
         WantedBy=multi-user.target 

接下来我添加了 django_crontab 作业:

PYTHONPATH=/etc/opt/<project_name>:/opt/<project_name> DJANGO_SETTINGS_MODULE=settings su <new_user> -c "/opt/<project_name>/venv/bin/python3 /opt/<project_name>/manage.py crontab add"

使用.... crontab show 检查 crontab 作业会得到:

<HASH KEY> -> ('*/4 * * * *', '<my_django_app>.cron.remove_stamps')
<HASH KEY> -> ('*/5 * * * *', '<my_django_app>.cron.close_stamps')

使用journalctl _COMM=cron --since="2021-5-1 14:00" 检查作业是否运行,给出以下信息:

...
May 01 17:00:01 ubuntu-2gb-hel1-2 CRON[276942]: pam_unix(cron:session): session opened for user <new_user> by (uid=0)
May 01 17:00:01 ubuntu-2gb-hel1-2 CRON[276940]: pam_unix(cron:session): session opened for user <new_user>by (uid=0)
May 01 17:00:01 ubuntu-2gb-hel1-2 CRON[276946]: (<new_user>) CMD (/opt/<project_name>/venv/bin/python3 /opt/<project_name>/manage.py crontab run <HASH KEY>>
May 01 17:00:01 ubuntu-2gb-hel1-2 CRON[276947]: (<new_user>) CMD (/opt/<project_name>/venv/bin/python3 /opt/<project_name>/manage.py crontab run <HASH KEY>>
May 01 17:00:08 ubuntu-2gb-hel1-2 CRON[276945]: pam_unix(cron:session): session closed for user <new_user>
May 01 17:00:08 ubuntu-2gb-hel1-2 CRON[276942]: pam_unix(cron:session): session closed for user <new_user>
...

我知道 cronjob 运行正常但没有执行脚本。但我不知道如何解决。我完全被困住了。欢迎所有帮助。

我还尝试使用 crontab -e 添加一个 cronjob,但后来我陷入了如何在 virtualenv 中使用 的问题。

【问题讨论】:

    标签: django ubuntu cron gunicorn django-cron


    【解决方案1】:

    我找到了将 cron 作业添加到我的 django 项目的解决方案。我使用了 django 命令 (django documentation)。如下所示,我在&lt;my_django_app&gt;(&lt;django_project&gt; 的一部分)中创建了一个management/commands/ 文件夹并添加了命令脚本文件。

    <my_django_app>/
        __init__.py
        models.py
        management/
            __init__.py
            commands/
                __init__.py
                <my_command_script>.py
        tests.py
        views.py
    

    在 de 脚本中,我使用了 django 文档中解释的 BaseCommand 类:

    from django.core.management.base import BaseCommand, CommandError
    from <my_django_app>.models import <my_model>
    from datetime import datetime
    
    
    class Command(BaseCommand):
        help = 'Closes stamps that have NO end date'
    
        def handle(self, *args, **options):
            try:
                stamps = <my_model>.objects.filter(date=None)
            except stamps.DoesNotExist:
                raise CommandError('No stamps available to close')
    
            for stamp in stamps:
                stamp.date = datetime.now()
                stamp.save()
    
            self.stdout.write(self.style.SUCCESS('Successfully closed the stamps'))
    

    我可以使用以下脚本执行命令:

    PYTHONPATH=/etc/opt/<project_name>:/opt/<project_name> DJANGO_SETTINGS_MODULE=settings su <new_user> -c "/opt/<project_name>/venv/bin/python3 /opt/<project_name>/manage.py <my_command_script>"
    

    现在我仍然必须找到一种方法将其添加到 cron(不是一个简单的搜索)。我通过将&lt;my_cron_file&gt;.sh 添加到随机文件夹中来修复它。 (我假设我也可以使用/etc/cron.d/,但我还没有尝试过。)

    &lt;my_cron_file&gt;.sh :

    #!/bin/bash
    export PYTHONPATH=/etc/opt/<project_name>:/opt/ <project_name>
    export DJANGO_SETTINGS_MODULE=settings
    su <new_user> -c "/opt/<project_name>/venv/bin/python /opt/<project_name>/manage.py <my_command_script>"
    

    接下来我使用以下命令使该文件可执行:

    chmod 755 /<my_folder>/<my_cron_file>.sh
    

    然后我用 crontab -e 打开了 cron 作业并添加了以下行:

    */2 * * * * /<my_folder>/<my_cron_file>.sh
    

    现在脚本每 2 分钟执行一次。它似乎有效。

    我不确定这是不是正确的方法,所以如果有人发现问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2018-08-28
      • 2015-01-03
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多