2010-10-12 4 views
1

У меня есть особая ситуация, когда мне нужно запросить услугу, чтобы получать информацию для n пользователей в определенное время каждый день. Проблема в том, что если я сделаю это сразу, это приведет к отключению службы/сбою службы.Запуск задания cron каждые 10 секунд n раз, затем остановка

Чтобы преодолеть это, было бы лучше запустить это для x число пользователей каждые 10 секунд или до тех пор, пока x = n, а затем не остановится.

Я мог бы установить 1 cron-скрипт, который запускается ежедневно, а другой - каждые 10 секунд. Ежедневный скрипт установил бы значение в БД на 1 (например, «запуск запроса») (по умолчанию будет 0 для off), где затем второй скрипт (выполняется каждые 10 секунд) проверяет это значение базы данных на 1. После нахождения установите для него значение true, а затем повторите попытку через пользователей, запрашивающих пользователей службы x за раз, и увеличив другой столбец в той же таблице DB, чтобы отслеживать, где находится в списке.

Проблема с этим решением (по моему мнению) заключается в том, что второй скрипт, выполняющий каждые 10 секунд, должен каждый раз запрашивать БД, чтобы узнать, установлен ли параметр «начальный запрос» на 1. Это может быть довольно процессор тяжелый. У кого-то есть лучшее решение?

NB: Код написан на PHP - не можешь использовать сон из-за максимальное время выполнения PHP скриптов на сервере

Я мог бы в равной степени сделать это в Python, есть максимальное выполнение для ограничения на CGI скриптах?

+0

времени сна не может быть включен в зависимости от ваших ОС: http://stackoverflow.com/questions/740954/does-sleep-time-count-for-execution-time-limit – ROunofF

ответ

5

Почему бы не просто создать один скрипт cron, который работает ежедневно, а просто вызывает другой скрипт каждые десять секунд, пока другой скрипт не скажет, что это сделано (например, возвращает значение, которое говорит «больше ничего не обрабатывать»)?

Или один скрипт, который работает ежедневно, и просто проходит через куски пользователей в цикле сна() ИНГ каждые X пользователей ...

Имейте в виду, что при использовании CLI version of PHP вы не ограничены временные ограничения выполнения, и вы можете хорошо взаимодействовать с cron и другими командами оболочки, используя стандартные ошибки и выходные потоки и т. д.

Например, для первого подхода вам даже не нужно использовать PHP для «контрольный» сценарий - очень простой сценарий оболочки, который просто петли, вызывая ваш PHP-скрипт, а затем спящий, и проверяя значение возврата «success» (возвращаемое функцией exit() скрипта PHP ион) было бы хорошо.

+0

не есть ли максимальное время выполнения для PHP-скриптов? Если я использую сон, тогда максимальное время выполнения должно быть установлено в часах ... Неправильная практика. Как я могу получить один скрипт для вызова другого каждые 10 секунд без использования сна, как вы упомянули в своем 1-м абзаце? – Martin

+2

@Martin Если вы используете [версию CLI для PHP] (http://www.php.net/manual/en/features.commandline.introduction.php), вы не должны запускать ограничения времени выполнения (см. [ эта статья] (http://www.macronimous.com/resources/Command_Line_Scripting_in_PHP.asp) для нежного введения). –

+0

Фантастический, спасибо Мэтту! Узнай что-нибудь новое каждый день :) – Martin

1

Вы можете использовать 'at' в комбинации с 'cron'. Настройте задание cron, которое запускает одну задачу один раз в день, и эта задача (у меня нет окна UNIX передо мной в данный момент, поэтому может возникнуть нечетная синтаксическая ошибка).

0 9 * * * at now + 10 secs /path/to/shellscript 1 

Аргумент, являющийся счетчиком прогона. При запуске shellscript, он перепланирует себя работать, увеличивая количество бега, так что вы могли бы:

#!/bin/ksh 

integer i 
let i=1+$1 
if [[ $i -lt 11 ]] 
then 
    at now + 10 secs /path/to/shellscript $i 

    # do everything else the script needs to do 
fi 

Примечание: Это решение также предполагает «в» может пойти вниз в секунду времени (не уверен, если это возможно или нет, может зависеть от реализации). Если это не означает, что это решение, вероятно, пусто и недействительно: •) В этом случае вам лучше иметь один скрипт, который делает вещи и спит (согласно ответу Мэтта Гибсона).

0

несколько способов сделать это:

  • Есть скрипт, который запускает часть работы, ввод всех данных в переменную, которую сериализовать данные и состояние. Я реализовал контроллер планировщика для воспламенителя кода для извлечения маршрутов метрополитена по одному в то время http://www.younelan.com/index.php?&repository=DCExplorer. Это может быть более сложным, чем то, что вы ищете, но может дать вам представление о том, как выполнять несколько задач с различными интервалами, разбивая их на более мелкие части.
  • запустить сценарий из командной строки либо через cron, либо вручную - нет страдающий от таймаутов
+0

Спасибо, что ответили! Обязательно внимательно прочитайте [FAQ по самопомощи] (http://stackoverflow.com/faq#promotion). Также обратите внимание, что * требуется *, что вы публикуете отказ от ответственности каждый раз, когда вы ссылаетесь на свой собственный сайт/продукт. –

Смежные вопросы