Запустите команду Django из crontab, только один одновременно

У меня есть Django похвальный "сценарий", который я запускаю каждые 20 секунд

как это:: (показывает только часть, и работает нормально;))

* * * * * /manage.py btupdate
* * * * * sleep 20; /manage.py btupdate
* * * * * sleep 40; /manage.py btupdate

Моя проблема в том, что "командный скрипт" иногда может занимать более 20 секунд. выполнить, и я не хочу начинать другую работу до того, как последняя работа была остановлена.

Как это решить?;)

2 ответа

Решение

Вы можете использовать файл в качестве индикатора работы. (может быть, вы тоже можете использовать идентификатор процесса, но решение с файлом достаточно просто)

  1. проверьте, существует ли /tmp/iam_working
  2. если не существует - создайте его и запустите скрипт (если существует - ничего не делайте)
  3. удалить файл после завершения работы

в 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()
Другие вопросы по тегам