Как работает crontab?

У меня два вопроса.
Можно ли поставить крон на 1 минуту и проверять есть ли задание, для скрипта, в бд и если есть выполнять его, а это не быстро? В основном интересует нагрузка на сервер.
И что будет если в одно время, через крон, несколько раз обратиться к одному скрипту, не получится, что запросы будут конфликтовать друг с другом?
  • Вопрос задан
  • 682 просмотра
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
> Можно ли поставить крон на 1 минуту
Можно.

> и проверять есть ли задание, для скрипта, в бд
Можно.

> и если есть выполнять его,
Можно

> а это не быстро?
А это не вопрос.

> В основном интересует нагрузка на сервер.
От крона нагрузка будет несущественная. От вашего скрипта - зависит от вашего скрипта.

> И что будет если в одно время, через крон, несколько раз обратиться к одному скрипту
Скрипт будет выполнен несколько раз.

> не получится, что запросы будут конфликтовать друг с другом?
Если вы эту ситуацию обработаете в своём скрипте, то не будут. В кроне никаких встроенных механизмов для этого нет.
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
что запросы будут конфликтовать друг с другом?

Конечно получится. Race-condition получить запросто, потому что крон - простейшая и тупейшая программа. Все, что она умеет - разобрать строку, где указывается частота запуска и запустить процесс. А работа запущенного процесса - это не его проблема. Навесить очередь из сотни скриптов или развалить к хренам БД - как здрассьте.
Вам лучше не насиловать крон, а демона написать, который сам будет проверять наличие задания для него и сам делать все блокировки.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Можно ли поставить крон на 1 минуту и проверять есть ли задание, для скрипта, в бд и если есть выполнять его, а это не быстро? В основном интересует нагрузка на сервер.

Легко

И что будет если в одно время, через крон, несколько раз обратиться к одному скрипту, не получится, что запросы будут конфликтовать друг с другом?

Сделайте блокировку в скрипте. Стандартный вариант - создавать pidfile, с номером текущего процесса. Другой экземпляр скрипта перед тем как выполнять тяжелую задачу, первым делом проверяет что существует pidfile, вторым проверяет что процесс который указан в pidfile существует - и если все верно, завершает работу. Если нет - создает собственный pidfile и начинает выполнять "тяжелый" запрос.

Вместо Pidfile можно использовать любой другой механизм, подходящий вашему языку/стеку.

Таким образом легко решается задача, чтобы проверка запускалась раз в минуту и скрипты друг друга не лочили.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы