2012-04-08 21 views
5

Moja aplikacja internetowa ma 3 główne składniki node.js: witrynę, kanały i zadania.Forever.js uruchamianie i ponowne uruchamianie wielu skryptów

Aby uruchomić te używam zawsze:

//forever.js 

var forever = require('forever'); 

function start(name){ 

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

}; 

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

Co raz pierwszy zauważył, że jeśli mogę uruchomić skrypt przyzwyczajenie uruchomić go jako demon. (Co jest najbardziej prawdopodobne normalny)

node forever.js 

Więc co zrobiłem było uruchomić następny forever.js skryptu z wiecznie. Nie jestem pewien, czy to jest poprawne, istnieje również forever.startDaemon, więc nie jestem pewien, którego powinienem użyć.

Działa to, ale problem polega na tym, że chciałbym zrestartować wszystkie procesy po opublikowaniu nowej wersji mojej aplikacji. Używam git's post-receive hook, aby uruchomić forever.js za pierwszym razem, ale jeśli zrobię to na każdym post-otrzymaniu, to po prostu odradzam 3 procesy za każdym razem.

Sądzę, że potrzebuję sposobu na ponowne uruchomienie 3 procesów, jeśli są już uruchomione. Myślałem, że to zrobić z forever.list ale dokumentacja tylko powiedzieć:

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() 

Przede wszystkim nie jestem pewien środek jakim formacie i drugi to oczekuje zwrotna ale potem mówi jej synchroniczne. Co jest trochę mylące i nie jestem pewien, jak używać listy.

Ostatecznie wszystko, co chcę zrobić, to uruchomić/ponownie uruchomić 3 procesy node.js na haku po odebraniu git.

+0

można po prostu uruchomić 'zawsze restart forever.js'? Wyobrażam sobie, że zabiłoby to dziecięce skrypty, ale jeśli nie, po prostu rób "na zawsze", zakładając, że nie uruchamiasz innych projektów z tą samą instancją na zawsze. –

Odpowiedz

11

Myślę, że najlepszym sposobem na to jest:

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

a następnie w git po otrzymać haczyk:

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

Owijanie te procesy węzłów wewnątrz jednego procesu nie jest dobry pomysł. Teraz osobiście używam Supervisord with monit zamiast na zawsze (superwordor jest bardziej stabilny & potężniejszy niż na zawsze IMHO).

+1

Przełączyłem się na Upstart, co wydaje się także bardziej ogólnym rozwiązaniem.Myśl o tym od razu, ale konieczność uczenia się czegoś nowego w terminie może być denerwująca. Znalazłem ten świetny przewodnik po nowościach: http://upstart.ubuntu.com/cookbook/ Zaznaczę to jako poprawną odpowiedź, ponieważ jest to najprawdopodobniej najlepsze rozwiązanie. – Pickels

2

robię to tak:

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

działa jak czar, nigdy nie dostać zduplikowane procesy używając ./run.sh

Aby odczytać logi, używam tail -f/ścieżka/do/.log

1

Tak, jest to możliwe. Aby uruchomić skrypt, należy użyć polecenia npm run forever.

Dodaj to do swojej 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" 
} 

Można tworzyć package.json korzystając npm init

Powiązane problemy