Это касается другого поста, который я написал, но он отличается, поэтому я разместил его как новый вопрос.
У меня есть сценарий, который запускается, обработка которого может занять чуть более 1 минуты, а мой cron настроен на запуск каждую минуту. Я могу остановить другое задание cron, выполняющее сценарий, если первое не было завершено, используя flock (php) в файле, однако это означает, что я потеряю одну итерацию процедуры и мне придется подождать почти минуту, прежде чем она будет снова срабатывает (как я понимаю).
Я бы хотел, чтобы сценарий был заблокирован, а не взорваться, а подождать. Однако со временем это может стать довольно большим, поэтому я также хотел бы ограничить количество cron в очереди до 10.
Я новичок в Linux (у меня Linux VPS уже 3 дня), поэтому я не уверен, что мое решение вообще практично.
Спасибо.
Я бы сказал, что каждое задание может создать файл блокировки и ожидать появления новейшего существующего файла блокировки. Если количество файлов блокировки равно 10, то выйдите, вместо того чтобы создавать и ждать.
Как отмечали другие, cron здесь не тот инструмент.
На что следует обратить внимание с файлами блокировки: * Вы должны убедиться, что они очищены при выходе или перезагрузке сервера. Если процесс завершается, а файл блокировки остается, вы можете столкнуться с ситуацией, когда вы никогда не запускаете его из-за 10 устаревших файлов блокировки. * Либо используйте программу, предназначенную для блокировки файлов, либо используйте каталоги. mkdir выдаст ошибку, если каталог существует, touch всегда будет возвращать успех, и вы откроете состояние гонки.
Почему это имеет значение, если один прогон не прошел? На этом этапе, я думаю, вам нужно выйти за рамки работы cron и сценария.
Здесь вы задаете вопрос по программированию. У вас может быть каждый запуск сценария, если он решает подождать, считывать счетчик в текстовом файле, а затем увеличивать его во время ожидания, а затем уменьшать его, когда он, наконец, запускается. Если показания счетчика больше 10, то вы просто выходите. Но теперь вы должны убедиться, что ничто не пытается одновременно прочитать или записать счетчик.
На этом этапе почему бы вам не написать это как демон, чтобы он мог отслеживать собственное состояние? Возможно, вы даже захотите написать его как сервер и клиент.
В чем разница между очередями: 1 или 10, как только вы начнете ставить в очередь, не похоже, что ваша cronjob внезапно ускорится, а вещи из очереди просто выполняются меньше, чем раньше.
Я бы сказал, что скопление и проверка - это нормально; если вы действительно хотите сделать это, как вы просили, вы можете реализовать собственный механизм блокировки и ставить процессы в очередь, если они читают из некоторых файлов, количество которых меньше 10 или что-то в этом роде.
Как будто cronjob просыпается; проверяет, существует ли / tmp / count, если нет echo 1> / tmp / count, если он существует, увеличивает значение числа в / tmp / count; когда сценарий cronjob выполнен, уменьшите значение / tmp / count, если файл существует, если уменьшите с 1 до 0, удалите файл; когда количество в файле достигнет 10, просто выйдите из сценария.
Я бы пропустил cron здесь. просто следите за всеми файлами и используйте их, когда они не заблокированы, по мере необходимости. Это возможно?
Вы можете использовать программу под названием The Fat Controller. Он работает как CRON, регулярно запускает сценарий, однако вместо того, чтобы запускать каждые x минут или секунд, он ждет x минут или секунд с момента завершения сценария, прежде чем запускать его снова.
Он также имеет другие функции, такие как:
Взгляните на веб-сайт: www.4pmp.com/fatcontroller/
Есть дополнительная информация и варианты использования.