2011-12-30 81 views
28

我们使用PHP gearman worker并行运行各种任务。一切都很顺利,而且我有一些愚蠢的小外壳脚本可以在我想要的时候旋转它们。作为程序员(因此懒惰),我想看看我是否可以通过一个暴发户脚本旋转这些。自动启动多个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”子句自动执行此操作?

例如,启动实例1,2,3,4?那么让他们正常关机退出?

我想我可以把它钩到一个init.d脚本中,但我想知道新贵是否可以处理这样的事情,或者如果有人已经找到了这个问题。

干杯家伙!

回答

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/#taskhttp://upstart.ubuntu.com/cookbook/#instance

+0

非常感谢!我试图用类似的方式解决它,但是我错过了'任务'位,所以循环的第一次迭代就会被阻塞。真棒。 :) – mkgrunder 2012-01-09 01:42:42

+11

你也应该结帐http://stackoverflow.com/questions/12084025/restarting-upstart-instance-prcesses,它允许不仅启动多个实例,但也阻止它们。 – Evgeny 2012-10-23 15:17:15

+0

我已阅读文档,但我仍然不明白,为什么该循环在第一次迭代中被阻塞,除非它是一项任务?/cc @mkgrunder – Mahn 2014-08-29 10:55:54