6

私のWebアプリには、Webサイト、フィード、ジョブの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.jsスクリプトをforeverで実行することでした。これが正しいかどうかはわかりませんが、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の受信後フックで3つのnode.jsプロセスを開始/再起動することだけです。

4

3 に答える 3

14

I think the best way to do this is:

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

and then in your git post-receive hook:

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

Wrapping these node processes inside a single process is not a good idea. I now personally use Supervisord with monit instead of forever (supervisord is more stable & powerful than forever IMHO).

于 2012-04-09T20:33:29.063 に答える
5

I do it like this:

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

Works like a charm, I never get duplicate processes using ./run.sh

To read logs, I use tail -f /path/to/.log

于 2014-06-05T17:14:07.603 に答える
1

Yes, it's possible. You need to use npm run forever command to run a script.

Add this to your 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"
}

You can create package.json using npm init

于 2016-07-25T17:13:54.460 に答える