Forever.js启动并重新启动多个脚本

问题描述:

我的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

我认为要做到这一点的最好办法是:

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

我不喜欢这样写道:

#!/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

是的,这是可能的。您需要使用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