2012-04-08 44 views
5

Ứng dụng web của tôi có 3 thành phần node.js chính: trang web, nguồn cấp dữ liệu và công việc.Forever.js bắt đầu và khởi động lại nhiều tập lệnh

Để bắt đầu những Tôi đang sử dụng mãi mãi:

//forever.js 

var forever = require('forever'); 

function start(name){ 

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

}; 

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

gì đầu tiên tôi nhận thấy là nếu tôi chạy kịch bản nó sẽ không chạy nó như là một daemon. (Rất có thể là bình thường)

node forever.js 

Vì vậy, những gì tôi đã làm tiếp theo là chạy tập lệnh forever.js mãi mãi. Tôi không chắc chắn nếu điều này là chính xác, đó cũng là một forever.startDaemon vì vậy không chắc chắn mà tôi nên sử dụng.

forever start forever.js 

Điều này làm việc nhưng vấn đề là tôi muốn khởi động lại tất cả các quy trình khi phiên bản mới của ứng dụng được xuất bản. Tôi đang sử dụng hook sau khi nhận của git để chạy forever.js lần đầu tiên nhưng nếu tôi làm điều này trên mỗi bài nhận, nó sẽ chỉ sinh ra 3 tiến trình mỗi lần.

Vì vậy, tôi đoán tôi cần một cách để khởi động lại 3 quy trình nếu chúng đã chạy. Tôi nghĩ để làm điều này với forever.list nhưng tài liệu chỉ nói:

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

Trước hết tôi không chắc chắn những gì định dạng phương tiện và thứ hai nó hy vọng một callback nhưng sau đó nó nói đồng bộ của nó. Đó là một chút khó hiểu và tôi không chắc chắn làm thế nào để sử dụng danh sách.

Cuối cùng, tất cả những gì tôi muốn làm là bắt đầu/khởi động lại quy trình 3 node.js trên móc hậu nhận của git.

+0

Bạn có thể chỉ cần chạy 'mãi mãi khởi động lại forever.js'? Tôi sẽ tưởng tượng rằng sẽ giết các kịch bản con nhưng nếu không thì chỉ cần làm 'mãi mãi stopall' giả sử bạn không chạy các dự án khác với cùng một ví dụ mãi mãi. –

Trả lời

11

Tôi nghĩ rằng cách tốt nhất để làm điều này là:

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

và sau đó trong git của bạn sau khi nhận được móc:

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

Bao bì các quá trình này nút bên trong một quá trình duy nhất không phải là một tốt ý kiến. Bây giờ tôi sử dụng cá nhân Supervisord with monit thay vì mãi mãi (giám sát là ổn định hơn & mạnh hơn IMHO mãi mãi).

+1

Tôi chuyển sang Upstart mà dường như cũng là một giải pháp chung chung hơn.Tư tưởng làm điều đó ngay lập tức nhưng phải học một cái gì đó mới trong khi trên một thời hạn có thể gây phiền nhiễu. Tìm thấy hướng dẫn tuyệt vời này để bắt đầu ở đây: http://upstart.ubuntu.com/cookbook/ Tôi sẽ đánh dấu đây là câu trả lời đúng vì đây có thể là giải pháp tốt nhất. – Pickels

2

tôi làm điều đó như thế này:

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

trình như một say mê, tôi không bao giờ nhận quá trình trùng lặp sử dụng ./run.sh

Để đọc các bản ghi, tôi sử dụng tail -f/path/đến/.log

1

Có, có thể. Bạn cần sử dụng lệnh npm run forever để chạy tập lệnh.

Thêm phần này vào package.json bạn

"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" 
} 

Bạn có thể tạo package.json sử dụng npm init

Các vấn đề liên quan