Если у меня есть задание cron, которое запускается каждую минуту, и первые итерации выполняются в течение 62 секунд, будет ли вторая итерация запускаться до тех пор, пока не закончится первая ошибка, или может случиться, что одно и то же задание cron работает одновременно?
Чтобы проиллюстрировать это, см. Сценарий 1:
|0 |60 |120 |180 |240 |300 ------ Cron Job 1 Taking 60 Seconds --------- Cron Job 2 Taking 90 Seconds ------ Cron Job 3 Taking 90 Seconds but overlapping with the previous cron job
Является выше, что произойдет, или произойдет сценарий 2:
|0 |60 |120 |180 |240 |300 ------ Cron Job 1 Taking 60 Seconds --------- Cron Job 2 Taking 90 Seconds XXX-------Cron Job 3 waiting til the next 1 minute interval starts
Моя забота заключается в том, что на 30 секунд будет отмечен XXX, где будет выполняться NO CNON.
Что я пытаюсь сделать? Я хочу выполнять PHP-скрипт каждую секунду, бесконечно. Он не должен запускаться один раз в секунду, но он должен RUN, END, RUN, END, RUN, END. Если итерация занимает 5 секунд, она должна запускаться только после первого завершения. Но он никогда не должен останавливаться. Проблема в том, что я не могу определить длину итерации. Одна итерация может занять 1 секунду, или это может занять 5 секунд или даже больше.
Вы можете реализовать простой механизм блокировки, как следует.
if(!locked()) { lock(); // your code here unlock(); } else { echo "script already running"; } function lock() { file_put_contents("write.lock", 'running'); } function locked() { return file_exists("write.lock"); } function unlock() { return unlink("write.lock"); }
Да. cron запускает задание, но не проверяет, был ли ранее запущен. Это не управление очередью заданий.
Он начнет второй процесс независимо от другого экземпляра. В вашем скрипте вы можете проверить другие процессы (например, если существует глобальный PID-файл), который уже запущен или что-то еще, зависит от того, что вам нужно в точности.
будет ли вторая итерация запущена до тех пор, пока не закончится первое появление?
С Vixie cron, который по умолчанию используется для большинства Unix, ответ «да».
как я могу получить истинные интервалы в секунду в Linux-системе, которая выполняет PHP-скрипт?
Вопрос странный, пожалуйста, переформулируйте. Но если вы хотите, чтобы один экземпляр каждого скрипта работал одновременно, используйте / usr / bin / flock или любой другой инструмент mutex.
Я закончил с помощью supervisord, который решил все мои проблемы.
Вместо использования cron вы можете заглянуть в «демонтаж» вашего скрипта: Daemon системы PEAR
Оттуда, похоже, вам понадобится создать простую задачу / очередь задач / рабочих и использовать демон для отправки и блокировки соответственно.