运行 crontab 中的 Django 命令,只有一个并发
Run Django command from crontab, only one concurrently
我有一个 Django 推荐 "script" 我每 20 秒 运行
像这样::(只显示了它的一部分,并且工作正常;))
* * * * * /manage.py btupdate
* * * * * sleep 20; /manage.py btupdate
* * * * * sleep 40; /manage.py btupdate
我的问题是 "command script" 有时可能需要超过 20 秒。执行,我不想在上一个作业停止之前开始另一个作业。
如何解决? ;)
您可以使用文件作为工作指标。 (也许你也可以使用进程 ID,但文件的解决方案足够简单)
- 检查 /tmp/iam_working 是否存在
- 如果不存在 - 创建它并 运行 你的脚本(如果存在 - 什么都不做)
- 作业结束后删除文件
在bash中:
if [ ! -f /tmp/iam_working ] ; then touch /tmp/iam_working; yourcommands; rm /tmp/iam_working; fi
您还可以使用数据库模型作为工作指标。它可以说比基于文件的方法更干净。
# models.py
from django.db import models
class CommandStatus(models.Model):
running = models.BooleanField(default=False, null=False, blank=True)
从模型创建一个实例:
from myapp.models import CommandStatus
indicator = CommandStatus.objects.create()
在您的命令中使用实例:
status = CommandStatus.objects.all()[0]
if not status.running:
status.running = True
status.save()
# do stuff
status.running = False
status.save()
我有一个 Django 推荐 "script" 我每 20 秒 运行
像这样::(只显示了它的一部分,并且工作正常;))
* * * * * /manage.py btupdate
* * * * * sleep 20; /manage.py btupdate
* * * * * sleep 40; /manage.py btupdate
我的问题是 "command script" 有时可能需要超过 20 秒。执行,我不想在上一个作业停止之前开始另一个作业。
如何解决? ;)
您可以使用文件作为工作指标。 (也许你也可以使用进程 ID,但文件的解决方案足够简单)
- 检查 /tmp/iam_working 是否存在
- 如果不存在 - 创建它并 运行 你的脚本(如果存在 - 什么都不做)
- 作业结束后删除文件
在bash中:
if [ ! -f /tmp/iam_working ] ; then touch /tmp/iam_working; yourcommands; rm /tmp/iam_working; fi
您还可以使用数据库模型作为工作指标。它可以说比基于文件的方法更干净。
# models.py
from django.db import models
class CommandStatus(models.Model):
running = models.BooleanField(default=False, null=False, blank=True)
从模型创建一个实例:
from myapp.models import CommandStatus
indicator = CommandStatus.objects.create()
在您的命令中使用实例:
status = CommandStatus.objects.all()[0]
if not status.running:
status.running = True
status.save()
# do stuff
status.running = False
status.save()