alexanderkx
@alexanderkx

Почему «тяжёлый» скрипт по CRON выполняется несколько раз?

Приветствую,

CRON раз в минуту долбит в базу и ищет последнюю запись с полем pid=0.

Если находит, то выполняется разбор json с дальнейшей записью в разные таблицы БД того, что разобралось.

Недавно заметил, такую неприятность -
Например в разбираемом json есть такой блок:
...
   {
      "pr_id":5,
      "com_total":150,
   }
...


com_total со значением (150) в разбираемом объекте присутствует только в единственном числе, com_total пишется в отдельную таблицу. В итоге, иногда встречаю "дублирование", то есть в таблицу пишется два/три/более раза 150, хотя должно 1 раз. (и далеко не все записи так дублируются, )

Заметил закономерность, что чем "тяжелее" json, т.е. чем больше усилий на обработку, тем чаще происходят дублирования. ~1000-1500 блоков - всё хорошо, 2000 - ужа некоторые операции выполнит 2 раза, 4000 - 3 раза итд.

Если дело в некой нехватки чего-то, то я ожидал, что скрипт просто упадёт. Но нет, он выполняется, но как-то очень хитро.

Не подскажите с чем может быть связано?
Благодарю.
  • Вопрос задан
  • 801 просмотр
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Очевидно, что минуты скрипту на выполнение не хватает и он обрабатывает одни и те же данные несколько раз. Вам нужно отслеживать, что предыдущий запуск завершился во время старта нового. Если нет - то прерывать выполнение нового запуска и ничего не обрабатывать.

А самым правильным было бы попрофилировать скрипт. Минута - это очень большое время для компьютера и за это время он может очень многое сделать. Скорее всего, у вас неоптимальный алгоритм.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
По крону всё что делаете надо писать в какой-то лог дополнительный, например текстовый или БД и в скрипте делать более хитрые условия. Взяли запись 150 записали в текстовик если скрипт успешно отработал в самом конце стираете запись. В начале скрипта проверяете если скрипт взял 150 и в текстовике стоит 150 то что-то не так...
Ответ написан
Комментировать
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
flock -n /tmp/lockfile -c /path/to/script.sh
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы