2011-12-30 95 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