自动启动多个Upstart实例

28

我们使用PHP gearman workers来并行运行各种任务。一切都很顺利,我有一个简单的shell脚本以启动它们。作为一个程序员(因此很懒),我想知道是否可以通过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
我想使用这些工作进程的方式是启动一些它们(也许每个核心一个),我希望在启动时就这样做。需要明确的是,我不需要upstart脚本检测内核数。我很乐意只说“运行8个实例”,但这就是我想要多个运行的原因。有没有办法在upstart脚本中使用“start on”子句自动执行此操作?
例如,启动实例1、2、3、4?然后使它们能够在关闭时正确退出?
我想我可以将其连接到init.d脚本中,但我想知道upstart是否可以处理这样的事情,或者是否有人已经解决了这个问题。
谢谢大家!
1个回答

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

关键是将其作为任务,告诉upstart在该任务完成之前不发出任何事件。请参阅http://upstart.ubuntu.com/cookbook/#taskhttp://upstart.ubuntu.com/cookbook/#instance


非常感谢!我尝试以类似的方式解决它,但是我缺少了“任务”部分,因此循环的第一次迭代将会阻塞。太棒了。 :) - mkgrunder
11
您还应该查看https://dev59.com/Amct5IYBdhLWcg3wc9Eg,它不仅可以启动多个实例,还可以停止它们。 - Evgeny
我已经阅读了文档,但仍然不理解,为什么除非它是任务,否则循环在第一次迭代中会被阻塞?/cc @mkgrunder - Mahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接