У меня есть таблица MySQL, называемая cronjobs, которая хранится для каждой требуемой cronjob (например, удаляет старые письма, возраст профиля обновления и т. Д.). Для каждого cronjob существует определенный кодовый блок, который запускается, если cronjob (я получил разные интервалы для разных cronjobs).Предотвращение параллельного выполнения с помощью блокировки таблицы (MySQL)
Для выполнения должных cronjobs я получил скрипт PHP, который выполняется каждую минуту с помощью UNIX crontab (вызывает execute_cronjobs_due.sh, который вызывает «php -f /path/to/file/execute_cronjobs_due.php»).
При выполнении execute_cronjobs_due.php все cronjobs получают отметку о том, что они будут выполнены, так что другой вызов execute_cronjobs_due.php не приведет к параллельному выполнению того же самого cronjob, который уже выполняется.
Теперь проблема: иногда выполнение занимает более 60 секунд, но программа crontab не вызывает execute_cronjobs_due.sh через эти 60 секунд. На самом деле происходит то, что execute_cronjobs_due.sh вызывается сразу после выполнения предыдущего crontab. И если выполнение занимает более 120 секунд, следующие два исполнения инициализируются одновременно.
Временная шкала:
2015-06-15 10:00:00: выполнение execute_cronjobs_due.sh (занимает 140 секунд)
2015-06-15 10:02:20: два одновременных казни execute_cronjobs_due .sh
Поскольку он выполняется точно одновременно, не используется маркировка cronjob, которую они выполняют, так как выборки (которые фактически должны исключать отмеченные один раз) выполняются в одно и то же время. Таким образом, обновление происходит сразу после того, как вы уже выбрали соответствующие cronjobs.
Как я могу решить эту проблему, чтобы одновременно не выполнялось выполнение cronjobs? Могу ли я использовать блокировки таблиц MySQL?
Большое спасибо за вашу помощь заранее,
Фредерик
Какой cron вы используете, который не выполняет задания по заданному расписанию, но вместо этого ожидает завершения других заданий? – Eborbob