2012-04-08 214 views
5

我的web應用程序有3個主要node.js組件:網站,訂閱源和作業。Forever.js啓動並重新啓動多個腳本

要啓動這些我使用永遠:

//forever.js 

var forever = require('forever'); 

function start(name){ 

    forever.start(['coffee', name + '.coffee'], { /* log options */ }) 

}; 

start('website'); 
start('feeds'); 
start('jobs'); 

我首先注意到的是,如果我運行腳本,它不會運行它作爲一個守護進程。 (這很可能是正常的)

node forever.js 

所以我接下來做的是永遠運行forever.js腳本。我不確定這是否正確,也有forever.startDaemon所以不知道我應該使用哪一個。

forever start forever.js 

這可行,但問題是,我想重新啓動我的應用程序的新版本發佈時的所有進程。我使用git的post-receive hook第一次運行forever.js,但如果我在每次post-recieve上都這樣做,它每次只會產生3個進程。

所以我想我需要一種方式來重新啓動3個進程,如果他們已經在運行。我想用forever.list要做到這一點,但文檔只是說:

forever.list (format, callback) 

Returns a list of metadata objects about each process that is being run using 
forever. This method is synchronous and will return the list of metadata as such. 
Only processes which have invoked forever.startServer() will be available from 
forever.list() 

首先,我不知道是什麼格式的裝置和第二,預計回調,但隨後表示,其同步。這有點令人困惑,我不知道如何使用列表。

最後,我想要做的就是在git的post-receive鉤子上啓動/重啓3個node.js進程。

+0

可你只要運行的package.json'永遠重啓forever.js'?我會想象會殺死孩子的腳本,但如果沒有,那麼假設你沒有運行其他具有相同永久實例的項目,那麼就執行'forever stopall'。 – 2012-04-09 15:53:21

回答

11

我認爲要做到這一點的最好辦法是:

forever start website.js 
forever start feeds.js 
forever start jobs.js 

,然後在你的混帳後收到鉤:

forever restart website.js 
forever restart feeds.js 
forever restart jobs.js 

結束語一個單一的過程中,這些節點的過程是不是一個好理念。我現在親自使用Supervisord with monit而不是永遠(supervisord更穩定&比永遠恕我直言強大)。

+1

我切換到Upstart,這似乎也是一個更通用的解決方案。想到馬上做到這一點,但不得不在截止日期前學習新東西,這可能令人煩惱。在這裏發現這個新貴的指導:http://upstart.ubuntu.com/cookbook/我將這個標記爲正確的答案,因爲這很可能是最好的解決方案。 – Pickels 2012-04-09 21:04:06

2

我不喜歡這樣寫道:

#!/bin/sh 

# Make sure we're in the right place 
DIR=$(cd $(dirname "$0"); pwd) 
cd $DIR 
echo "[ I am $USER and I changed PWD to $DIR ]" 

forever restart --spinSleepTime=2000 api_daemon.js || (forever start --spinSleepTime=2000 api_daemon.js && forever list) 

得好好的,我從來沒有使用./run.sh

重複進程讀取日誌中獲取的,我用 尾-f /路/ to/.log

1

是的,這是可能的。您需要使用npm run forever命令來運行腳本。

添加到您的package.json

"scripts": { 
    "forever" : "forever start api/api-server.js && forever start www/www-server.js && forever start upload/upload-server.js && forever start static/static-server.js", 
    "test": "echo \"Error: no test specified\" && exit 1" 
} 

您可以使用npm init