Автоматический запуск нескольких экземпляров выскочки

Мы используем рабочие механизмы PHP gearman для параллельного выполнения различных задач. Все работает просто отлично, и у меня есть глупый маленький сценарий оболочки, чтобы раскрутить их, когда я захочу. Будучи программистом (и, следовательно, ленивым), я хотел посмотреть, смогу ли я раскрутить их с помощью сценария выскочки.

Я понял, как использовать строфу экземпляра, поэтому я мог начать их с номера экземпляра:

description "Async insert workers"
author      "Mike Grunder"

env SCRIPT_PATH="/path/to/my/script"

instance $N

script
    php $SCRIPT_PATH/worker.php
end script

И это прекрасно работает, чтобы запустить их так:

sudo start async-worker N=1
sudo start async-worker N=2

Я хочу использовать этих рабочих для запуска некоторого их количества (может быть, по одному на ядро ​​и т. д.), и я хотел бы сделать это при запуске. Чтобы было ясно, мне не нужен скрипт upstart для определения количества ядер. Я рад просто сказать «сделать 8 экземпляров», но именно поэтому я хочу несколько раз. Есть ли способ использовать пункт «start on» в сценарии выскочки, чтобы сделать это автоматически?

Например, запустить экземпляр 1, 2, 3, 4? Затем они выходят при выключении правильно?

Я полагаю, что мог бы подключить это к сценарию init.d, но мне было интересно, может ли выскочка справиться с чем-то подобным, или кто-нибудь разобрался с этой проблемой.

Здоровья, ребята!


person mkgrunder    schedule 30.12.2011    source источник


Ответы (1)


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

#/etc/init/async-workers-all.conf

start on runlevel [2345]

task

env NUM_WORKERS=8

script
  for i in `seq 1 $NUM_WORKERS`
  do
    start async-worker N=$i
  done
end script

Суть в том, чтобы сделать это задачей, которая сообщает upstart, чтобы задача выполнялась до завершения, прежде чем генерировать какие-либо события для нее. См. http://upstart.ubuntu.com/cookbook/#task и http://upstart.ubuntu.com/cookbook/#instance

person cwick    schedule 08.01.2012
comment
Большое спасибо! Я пытался сделать это аналогичным образом, но мне не хватало бита task, поэтому первая итерация цикла просто блокировалась. Потрясающий. :) - person mkgrunder; 09.01.2012
comment
Вы также должны проверить stackoverflow.com/questions/12084025/ что позволяет не только запускать несколько экземпляров, но и останавливать их. - person Evgeny; 23.10.2012
comment
Я прочитал документацию, но до сих пор не понимаю, почему этот цикл блокируется на первой итерации, если это не задача? /cc @mkgrunder - person Mahn; 29.08.2014