我正在尝试使用 django_crontab 每天运行两次计划脚本。我在ubuntu 18上本地测试过,可以用。但是,当我尝试在服务器上运行它(在远程 Ubuntu 服务器上运行 Django 项目的 python Docker 映像)时,什么也没有发生。 这是我的代码:
setting.py
:
INSTALLED_APPS = (
.
.
'django_crontab',
.
.
.
)
RONJOBS = [
('0 9,21 * * *', 'appname.folder.file.start')
]
我通过以下方式执行了 cron:
$ python manage.py crontab add .
并查看活动作业:
$ python manage.py crontab show
f95300a5599dc7687ac79ab51c8bb33c -> ('0 9,21 * * *', 'appname.folder.file.start')
def start():
logger.info(" process begins!")
do_something()
注意“start”功能已在生产服务器中测试并且有效。
我还尝试通过在
setting.py
: 添加 CRONJOB 的路径来映射 chronjob 日志
('0 9,21 * * *', 'appname.folder.file.start','>> /Logs/crontab.log')
但是文件
crontab.log
尚未创建。
有什么建议吗?谢谢!
我遇到了同样的问题,这就是我为解决前面提到的问题所做的:
cron
。service cron start
中添加了命令 CMD
。python manage.py crontab add
中添加了命令 CMD
。启动容器后,我检查了 cronjob 是否是使用命令
python manage.py crontab show
和 crontab -l
创建的。在这两种情况下我都可以看到 cronjobs。
我再次测试了它,它可以工作。我使用了以下内容:
docker-compose
command: bash -c "service cron start && python manage.py crontab add && gunicorn serv.wsgi:application --bind 0.0.0.0:8000 --timeout 600 --workers 5"
或 Django 的开发服务器。 python manage.py runserver 0:8000
Dockerfile
FROM python:3.9
RUN apt-get -y update
# Install cron.
RUN apt-get install -y cron && touch /var/log/cron.log
WORKDIR /app
COPY ./docker/python/django/requirements.txt /app/
RUN pip install -r requirements.txt
COPY ./app/ /app/```
Django-crontab 依赖于 cron 守护进程来运行,但许多 docker 镜像并未随其安装或以其他方式启动它。这是 init 程序的责任,大多数程序都没有这个责任。
您检查过 cron 的状态吗?我在生产环境中遇到了同样的情况,并意识到这就是问题所在。
首先通过运行
crontab -l
检查 cronjob 是否已正确安装,这可能取决于您的应用程序运行的用户,因此也许您必须向该命令添加其他选项。
如果安装了 crontab,则通过运行
service cron status
检查 cron 守护进程的状态。如果未启动,请运行 service cron start
并检查之后您的 cron 任务是否正常工作。您可能应该将其添加到您的启动脚本中。
我不知道这个问题是否已解决,但我有同样的问题,这个 docker 文件对我有用:
FROM python:3.9-bullseye
RUN pip install --upgrade pip
RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 -y
RUN apt-get install -y cron
RUN service cron start
COPY ./requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
ENV PORT 8080
RUN python3 manage.py crontab add
RUN service cron start
CMD cron;gunicorn --bind :$PORT --workers 3 --timeout 300 usertest.wsgi:application
如果您在生产中使用环境变量,您的 cronjob 可能无法访问它。以下信息可能会有所帮助,
如果您使用的是 Ubuntu >=18.0,请尝试进行以下更改。 我假设您已成功将 django-crontab 与您的 django 应用程序集成。现在,通过 ssh 访问您的服务器并输入“crontab -e”,您将看到您的 cronjobs 在这里定义。将环境变量添加到 cronjob 上方。请看一下下面的几行代码,了解它对您的问题有何意义 -
DB_NAME = "your database name"
DB_USER = "User"
DB_PASSWORD = "password"
SECRET_KEY = "************************"
*/1 * * * * /home/sms/sms/env/bin/python /home/sms/sms/sms-
backend/website/manage.py crontab run 446aeeebac8c8f82d9e01bb662dc9b21 >>
/tmp/scheduled_job.log # django>
希望你能摆脱它。
在settings.py文件的INSTALLED_APPS中添加django_crontab
CRONJOBS = [ ('5 * * * *', 'attendance.cron.print_message', '>> /var/log/cron.log 2>&1'), ]
这是我的 DockerFile
FROM python:3.9
ENV PYTHONUNBUFFERED=1
RUN apt-get update \
&& apt-get install gcc -y \
&& apt-get clean \
&& apt-get install gunicorn3 -y \
#&& apt-get install python3.9-dev -y \
&& apt-get install libcurl4-gnutls-dev librtmp-dev -y \
&& apt-get install libnss3 libnss3-dev iputils-ping -y \
&& apt-get install -y cron && touch /var/log/cron.log
RUN touch /var/log/attendance_system.log
WORKDIR /attendance_system
COPY requirements.txt /attendance_system/
RUN pip install -r requirements.txt
COPY . /attendance_system/
RUN chmod +x common_commands.sh
RUN bash common_commands.sh
EXPOSE 8000
EXPOSE 8001
这是我的common_commands.sh 文件
#!bin/bash
crontab -r # remove exist one
python manage.py crontab add # add
exec "$@"
这是我的网络容器:
web:
container_name: attendance_system
build: .
command: bash -c "service cron start && daphne -b 0.0.0.0 -p 8000 AttendanceSystem.asgi:application"
# command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/attendance_system
ports:
- "8000:8000"
environment:
- TZ=Asia/Karachi
depends_on:
- db
- redis
注:
命令:
sudo docker-compose exec -it **container_name or ID** /bin/bash
python
from datetime import datetime
print(datetime.now())
print 会将您当前的日期时间显示为本地计算机(如果没有),然后按照我在 Web 容器中设置的方式设置 docker 容器的时区。