6

我的网络应用程序有 3 个主要的 node.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 运行forever.js 脚本。我不确定这是否正确,还有一个 forever.startDaemon 所以不确定我应该使用哪个。

forever start forever.js

这可行,但问题是我想在发布我的应用程序的新版本时重新启动所有进程。我第一次使用 git 的 post-receive 挂钩来运行 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 进程。

4

3 回答 3

14

我认为最好的方法是:

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

然后在你的 git post-receive 钩子中:

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

将这些节点进程包装在单个进程中并不是一个好主意。我现在个人将Supervisord 与 monit 一起使用,而不是永远使用(supervisord 比永远恕我直言更稳定和强大)。

于 2012-04-09T20:33:29.063 回答
5

我这样做:

#!/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 得到重复的进程

要阅读日志,我使用 tail -f /path/to/.log

于 2014-06-05T17:14:07.603 回答
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"
}

您可以使用创建 package.jsonnpm init

于 2016-07-25T17:13:54.460 回答