簡體   English   中英

django_crontab 正在添加我的工作,但它們似乎沒有執行。 有什么解決辦法嗎?

[英]django_crontab is adding my jobs, but they don't seem to execute. Any solution?

我有一個 django 項目在 Ubuntu 20 上運行 django-crontab ( github )。

在 <my_django_app> 目錄中我添加了一個 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 在命令行中創建一個 <new_user> ,如下所示:

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

使用 Nginx 我使用這個 <new_user> 使用 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 作業.... crontab show給出:

<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 中的 <new_user> 一起使用的問題上。

我找到了一個將 cron 作業添加到我的 django 項目的解決方案。 我使用了 django 命令( django 文檔)。 正如您在下面看到的,我在<my_django_app><django_project> django_project> 的一部分)中創建了一個management/commands/文件夾並添加了命令腳本文件。

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

在 de 腳本中,我使用了BaseCommand class,如 django 文檔中所述:

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(不是一個簡單的搜索)。 我通過將<my_cron_file>.sh添加到隨機文件夾中來修復它。 (我想我也可以使用/etc/cron.d/ ,但我還沒有嘗試過。)

<my_cron_file>.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 分鍾執行一次。 它似乎工作。

我不確定這是正確的方法,所以如果有人看到問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM