Forever.js запуск и перезапуск нескольких скриптов
Мое веб-приложение имеет 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 в первый раз, но если я сделаю это для каждого пост-получения, он будет порождать 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()
Во-первых, я не уверен, что означает формат, а во-вторых, он ожидает обратного вызова, но затем он говорит, что он синхронный. Что немного сбивает с толку, и я не уверен, как использовать список.
В конце концов, все, что я хочу сделать, это запустить / перезапустить 3 процесса node.js на хите post-receive.
3 ответа
Я думаю, что лучший способ сделать это:
forever start website.js
forever start feeds.js
forever start jobs.js
а затем в вашем git post-receive hook:
forever restart website.js
forever restart feeds.js
forever restart jobs.js
Заключение этих процессов в один процесс не очень хорошая идея. Теперь я лично использую Supervisord с monit, а не навсегда (supervisord более стабильный и мощный, чем IMHO).
Я делаю это так:
#!/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
Да, это возможно. Вам нужно использовать 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.json используя npm init