2013-02-25 148 views
3

我使用foreman在生產服務器上運行我的node.js應用程序(Ubuntu服務器12)。 工頭有一個很棒的工具來爲暴發戶創建腳本。Upstart和init.d的優先級

的問題是,當我重新啓動服務器,我的應用程序(由工頭管理)之前的Redis服務器的推出,我已經建立了一些技巧,以等待一個有效的連接。

理想的解決方案將是啓動的Redis服務器的前面,和母雞的節點應用,當一切都開始了。

引導配置:

  • Redis的服務器被/etc/init.d/redis-server推出,是/etc/rc2.d/S20redis-server
  • 我節點應用程序開始/etc/init/stocks-streamer*.conf文件

我的問題是:你將如何改變我的節點應用程序的啓動順序? 我想在我的應用程序開始等待Redis的服務器,但是當我這樣做,它不會啓動:

start on (started redis-server) 

我想,那是因爲沒有事件是從的init.d腳本到暴發戶,但也許發有一種方法我不知道?

感謝您的幫助!

回答

1

也許你應該Redis的被工頭,而不是開始,這樣你就可以更好地控制您的應用程序的所有依賴。

,或者確保工頭開始遠遠晚於Redis的(確保工頭在/etc/rc2.d中的鏈接比S20上市以後*

一個比較另類:已Redis的服務器也被新貴開始,這。很可能將幫助新貴管理依賴

有關於如何做到這一點下面的解釋是:https://gist.github.com/bdotdub/714533

我建議使用「開始必須先另一個服務」,而不是(http://upstart.ubuntu.com/cookbook/#start-must-precede-another-service),這樣的Redis被啓動時你開始你自己的服務

+0

問題是我沒有在/etc/rc2.d中的新貴腳本的痕跡。 暴發戶使用事件來啓動和停止腳本。 我想我必須從redis-server腳本發出一個事件,但我不知道該怎麼做。 – 2013-02-25 15:04:46

+0

我已經更新了我的答案,建議使用upstart來運行redis。如果新貴管理所有的依賴關係,這應該讓'開始'按預期工作。 – 2013-02-25 19:23:24

0

由於這個問題沒有被接受的答案,並且鑑於我在這裏遇到同樣的問題,我想我會提供另一種解決方案。這個問題可以重新陳述爲:

如何在init.d腳本上等待一個暴發戶的工作?

由於OP在問題中說,init.d腳本啓動時可能發出upstart事件。這樣,新貴的工作可以有一個簡單的start on started SCRIPT_NAME聲明。

在我的情況下,使用基於定製CentOS的發行版,我的/etc/rc.d/rc負責執行sysvinit(init.d)腳本。該腳本完全暴發戶,併爲每個啓動/停止的sysvinit腳本發出暴發事件。

換句話說,該/etc/rc.d/rc腳本有這樣的事情(簡體離開多汁的東西):

for i in /etc/rc$runlevel.d/S* ; do 
    subsys=${i#/etc/rc$runlevel.d/S??} 
    initctl emit --quiet starting JOB=$subsys 
    $i start 
    initctl emit --quiet started JOB=$subsys 
done 

我想你需要看看你的腳本,並添加事件發射,你認爲這很合適。就我而言,排放已經在那裏。

你可以在一個暴發性的工作中等待幾個事件。請參閱this問題以瞭解如何查找可用事件(我沒有找到更好的文檔說實話)。

特別是grep -r emit的竅門似乎非常有用。