|
|
|
| Прошу прощения если не туда.
Возможно ли както настроить крон так, чтобы следующий вызов скрипта был только после того как выполнится скрипт запущенный предыдущим вызовом крона?..
Пытаюсь таким способом решить ограничение max_execution_time..(скрипт должен работать около 15 часов) Возможно копать нужно не под крон даже, а посоветуете иные идеи реализации сего? | |
|
|
|
|
|
|
|
для: sl1p
(10.04.2011 в 03:53)
| | Запускайте скрипт каждую минуту, при этом пусть он пишет в файл или лучше в базу данных признак-флаг того, что он работает или не работает. В зависимости от состояния этого флага продолжайте работу вновь запущенного скрипта или прекращайте её. | |
|
|
|
|
|
|
|
для: cheops
(10.04.2011 в 16:05)
| | я так впринципе и метился.. спасибо..
А есть ли какието ещё способы решения работы скрипта такой длительности? | |
|
|
|
|
|
|
|
для: cheops
(10.04.2011 в 16:05)
| | зы. вопрос по вашему примеру, как поступить если выполняемый скрипт не успеет поставить флаг о том что он завершил работу, если он будет убит сервером за превышеный лимит работы?.. | |
|
|
|
|
|
|
|
для: sl1p
(11.04.2011 в 21:45)
| | Обработка этой ситуации зависит от того, что позволено cron, в частности достаточно ли у вас прав и есть ли возможность запуска команды ps, чтобы можно было обнаружить процессы по их pid. Если нет, то можно измерить время выполнения команды (к сожалению, оно физически очень часто превышает 30 секунд) и снимать флаг по тайм-ауту. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 07:14)
| | Случайно в голову пришла идея: вместо флага писать текущее время + 30сек например (в скрипте идёт цикл, одна итеррация занимает примерно 10 секунд, каждую итеррацию флаг обновляется, т.е. снова текущее время +30 сек. Вначале скрипта просто идёт проверка на то, является ли текущее время больше того которое во флаге, если же да, значит предыдущий вызов крона уже умер и не обновляет флаг. Идея достойна жизни?) | |
|
|
|
|
|
|
|
для: sl1p
(12.04.2011 в 10:05)
| | Хорошая мысль, только по возможности нужно разделить задачи ожидания и вычисления. Ждать ответ сети или MySQL скрипт может очень долго и это время не входит в 30 секунд машинного времени, отводимого скрипту. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 12:41)
| | Хм, а как же здесь быть, каким образом разделить?..
Впринципе такого быть по сути не должно, но даже если случится, это возможно кратковременный сбой гдето какойто.. тогда следующий вызов продолжит работу.. Но хотелось бы всё равно услышать Ваш вариант. | |
|
|
|
|
|
|
|
для: sl1p
(12.04.2011 в 14:10)
| | Ну, обычно максимальную неучтенную задержку дает сеть, т.е. файлы грузить с других хостов лучше отдельным заданием, а их разбирать (если такая задача есть) совершенно посторонним заданием, которое выполняется спустя значительное время после первого. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 14:23)
| | хмхм.. понял но не до конца, что решит разбивка этих задач? | |
|
|
|
|
|
|
|
для: sl1p
(12.04.2011 в 15:19)
| | Маштабируемость, в случае задания-загрузки вы будете знать, что загрузка идет долго, но никогда не достигнет 30 секунд, даже если фактически файл качается часами. А в случае задания-обработки длительность будет примерно равна 30 секунд, так как будут идти сплошные вычисления. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 15:22)
| | тоесть если скрипт будет тянуть файл откудато больше лимита, он таки его дотянет? | |
|
|
|
|
|
|
|
для: sl1p
(12.04.2011 в 15:42)
| | Да, время которое он использует для загрузки по сети, обычно не учитывается в лимите, которое отводится скрипту на выполнение (даже если это часы работы). | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 16:28)
| | хмхм, не знал, хотя замечал что иногда намного дольше происходит работа скрипта чем лимит... очень полезно, спасибо. | |
|
|
|
|
|
|
|
для: cheops
(12.04.2011 в 16:28)
| | хм, скажите а функция sleep() использует лимит? Всмысле учитывается как время вычислений? | |
|
|
|
|
|
|
|
для: sl1p
(15.04.2011 в 21:56)
| | Нет. По крайней мере раньше это время ожидания не учитывалось (может чего-нибудь в последних версиях поменялось, но вряд ли). | |
|
|
|
|
|
|
|
для: cheops
(15.04.2011 в 22:17)
| | хм спасибо)
А возможно гдето можно прочитать об этой системке, как всё таки точно происходит?.. | |
|
|
|
|
|
|
|
для: sl1p
(15.04.2011 в 23:22)
| | Собственно есть только небольшое замечание в документации
The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.
которое можно перевести так
Функция set_time_limit() и директива max_execution_time влияют только на время выполнения самого скрипта. Расход времени на любую активность, которая случается вне его, такая как вызов системных команд с использованием system(), сетевые операции, запросы к базам данных и т.д. не включаются в максимальное время исполнения скрипта. Это не относится к Windows, где измеряется фактическое время. | |
|
|
|