django_crontab 正在添加我的作业,但它们似乎没有执行。任何解决方案?
django_crontab is adding my jobs, but they don't seem to execute. Any solution?
我在 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 中的 一起使用的问题。
我找到了将 cron 作业添加到我的 django 项目的解决方案。我使用了 django 命令 (django documentation)。如下所示,我在 <my_django_app>
(<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 分钟执行一次。好像还行。
我不确定这是正确的方法,所以如果有人发现问题,请告诉我。
我在 Ubuntu 20.运行 django-crontab (github) 上获得了一个 django 项目 运行。
在
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 我 运行 虚拟环境
[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 中的
我找到了将 cron 作业添加到我的 django 项目的解决方案。我使用了 django 命令 (django documentation)。如下所示,我在 <my_django_app>
(<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 分钟执行一次。好像还行。
我不确定这是正确的方法,所以如果有人发现问题,请告诉我。