Запустите команду Django из crontab, только один одновременно
У меня есть Django похвальный "сценарий", который я запускаю каждые 20 секунд
как это:: (показывает только часть, и работает нормально;))
* * * * * /manage.py btupdate
* * * * * sleep 20; /manage.py btupdate
* * * * * sleep 40; /manage.py btupdate
Моя проблема в том, что "командный скрипт" иногда может занимать более 20 секунд. выполнить, и я не хочу начинать другую работу до того, как последняя работа была остановлена.
Как это решить?;)
2 ответа
Решение
Вы можете использовать файл в качестве индикатора работы. (может быть, вы тоже можете использовать идентификатор процесса, но решение с файлом достаточно просто)
- проверьте, существует ли /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()