2011-12-30 3 views
28

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

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

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 

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

Например, start instance 1, 2, 3, 4? После этого выйдите их на выключение правильно?

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

Cheers guys!

ответ

40

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

#/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 

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

+0

Большое спасибо! Я попытался работать с ним аналогичным образом, но мне не хватало бит 'task', поэтому первая итерация цикла будет просто заблокирована. Потрясающие. :) – mkgrunder

+11

Вы также должны проверить http://stackoverflow.com/questions/12084025/restarting-upstart-instance-prcesses, который позволяет не только запускать несколько экземпляров, но и останавливать их. – Evgeny

+0

Я прочитал документацию, но я до сих пор не понимаю, почему этот цикл блокируется на первой итерации, если это не задача?/cc @mkgrunder – Mahn

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