Làm cách nào để khởi động một máy chủ node.js như một quá trình daemon?


83

Trong Python Twisted, bạn có twistdlệnh giúp bạn một số việc liên quan đến việc chạy ứng dụng của bạn (ví dụ: daemonize nó).

Làm cách nào để bạn daemonize một máy chủ node.js để nó có thể chạy ngay cả sau khi phiên hiện tại bị đóng?

Cảm ơn bạn đã giúp đỡ


Câu trả lời:


92

Mãi mãi là câu trả lời cho câu hỏi của bạn.

Tải về

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

Sử dụng

Sử dụng Forever từ dòng lệnh

$ forever start server.js

Sử dụng một phiên bản của Forever từ Node.js

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', {
    max: 3,
    silent: true,
    args: []
  });

  child.on('exit', this.callback);
  child.start();

7
Nên sử dụng tùy chọn -g để cài đặt trên toàn cầu. Có thể cần quyền để làm như vậy.
— refaelio

1
điều gì xảy ra khi bạn khởi động lại?

1
@AlexBrown - bạn sẽ cần thêm forever start server.jstập lệnh khởi động (ví dụ rc.local), nếu bạn muốn nó tồn tại khi khởi động lại.
— UpTheCreek

3
Cuối cùng tôi quyết định sử dụng theo dõi để bắt đầu và dừng quá trình vĩnh viễn.

7
vĩnh viễn là chết, pm2 là tân vương. Xin đừng lãng phí thời gian của bạn vào mãi mãi. Tôi vừa chuyển sang và tôi bị thổi bay. pm2 có thể cân bằng tải ứng dụng của bạn trên tất cả các lõi bằng một ứng dụng đơn giản .. pm2 start app.js -i 0 --name "myapp" ... WOW ... hãy thử và bạn sẽ không bao giờ nhìn lại ... hãy xem @ Gary Bernitz câu trả lời
— Bồ Đào Nha 74

45

Nếu bạn cần quy trình của mình tự tạo daemonize, không chuyển tiếp mãi mãi - bạn có thể sử dụng mô-đun daemonize .

$ npm install daemonize2

Sau đó, chỉ cần ghi tệp máy chủ của bạn như trong ví dụ:

var daemon = require("daemonize2").setup({
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
});

switch (process.argv[2]) {

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");
}

Xin lưu ý bạn, đó là một cách tiếp cận cấp thấp.


2
Điều này có vẻ như là câu trả lời đúng hơn cho câu hỏi 'cách khởi động máy chủ node.js dưới dạng daemon'.
— Shyam Habarakada

2
Bạn đưa gì vào app.js? Nó chỉ thoát ra cho tôi ngay lập tức.
— chovy

1
Điều gì xảy ra khi khởi động lại?
— mixdev

case 'restart': daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;
— davidhq

23

Để khởi động systemdtrình nền quản lý dịch vụ, hãy ghi một tệp dịch vụ. Ví dụ: tạo một tệp /etc/systemd/system/myservice.service.

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

Hãy nhớ cập nhật daemon trình quản lý dịch vụ sau mỗi lần thay đổi tệp myservice.service.

$ systemctl daemon-reload

Sau đó bắt đầu chạy dịch vụ và cho phép dịch vụ bắt đầu khi khởi động.

$ systemctl start myservice
$ systemctl enable myservice

1
bạn đặt các đối số bổ sung cho server.js ở đâu trong trường hợp này?
— Nikita Fuchs

19

CẬP NHẬT : tôi đã cập nhật để bao gồm thông tin mới nhất từ ​​pm2:

trong nhiều trường hợp sử dụng, sử dụng dịch vụ systemd là cách đơn giản và thích hợp nhất để quản lý một tiến trình nút. đối với những người đang chạy nhiều quy trình nút hoặc các vi dịch vụ nút chạy độc lập trong một môi trường duy nhất, pm2 là một công cụ đầy đủ tính năng hơn.

https://github.com/unitech/pm2

http://pm2.io

  • nó có một tính năng giám sát thực sự hữu ích -> khá 'gui' để giám sát dòng lệnh của nhiều quy trình với pm2 monithoặc danh sách quy trình vớipm2 list
  • quản lý nhật ký có tổ chức -> pm2 logs
  • những thứ khác:
    • Cấu hình hành vi
    • Bản đồ nguồn hỗ trợ
    • Tương thích PaaS
    • Xem & Tải lại
    • Hệ thống mô-đun
    • Tải lại bộ nhớ tối đa
    • Chế độ cụm
    • Tải lại nóng
    • Quy trình phát triển
    • Tập lệnh khởi động
    • Tự động hoàn thành
    • Quy trình triển khai
    • Giám sát Keymetrics
    • API

2
vĩnh viễn là chết, pm2 là vua! Tôi đã sử dụng mãi mãi từ mãi mãi nhưng mới thực hiện chuyển đổi sang pm2. WOW! WOW! WOW! mãi mãi chạy ứng dụng của bạn trên 1 lõi, pm2 có thể làm tương tự HOẶC nó có thể cân bằng tải ứng dụng của bạn trên tất cả các lõi có sẵn. WOW! không cần công việc @reboot cron, chỉ cần khởi động pm2 (để khởi động pm2 như một dịch vụ hệ thống hoặc hệ điều hành tương đương) và sau đó lưu pm2. bây giờ khởi động lại và các ứng dụng của bạn vẫn đang chạy. Bạn có thể nhận được trạng thái của một ứng dụng đang chạy với pm2 hiển thị. đồng hồ có sẵn. WOW! WOW không thể tin được!
— danday74,

Việc thiết lập pm2 cho người dùng không phải root trong openshift là quá nhiều khó khăn.
— karthik101,

12

Cách tiếp cận đơn giản nhất sẽ chỉ để gửi lệnh xuống nền.

$ node server.js &

Sau đó, bạn có thể kết thúc quá trình sau đó. Tôi thường làm như sau:

$ killall node

Lưu ý : Tôi đang chạy OS X.


50
Lưu ý rằng điều này sẽ không hoạt động nếu bạn đăng xuất khỏi phiên terminal / ssh của mình. Các giải pháp đầy đủ cho điều đó là nohup nút server.js> / dev / null 2> & 1 &
— Michael Dillon

@MichaelDillon Tại sao bạn nghĩ chuyển hướng kết quả đầu ra /dev/nullnên được đưa vào giải pháp đầy đủ?
— nurettin

6

Bạn co thể thử:

$ nohup node server.js &

Nó hoạt động cho tôi trên Mac và Linux.

Đầu ra sẽ có trong ./nohup.outtệp

Nhưng tôi vẫn khuyên bạn nên sử dụng pm2hoặc forevervì chúng dễ dàng được sử dụng để khởi động lại, dừng và ghi nhật ký.


3

Có nhiều vận động viên đa năng nâng cao hơn, chẳng hạn như monitvà runit.


0

Để biết thông tin cơ bản về cách thông thường để daemonise trên hệ thống POSIX, bạn có thể tìm kiếm phương pháp C.

Tôi chưa thấy đủ các phương thức trong API node.js để cho phép nó được thực hiện theo cách C bằng tay. Tuy nhiên, khi sử dụng child_process, bạn có thể nhờ node.js làm điều đó cho bạn:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Tôi coi đây là một sự lãng phí thời gian tiềm ẩn vì có nhiều khả năng hệ thống của bạn cũng cung cấp như vậy.

Ví dụ:

http://libslack.org/daemon/manpages/daemon.1.html

Nếu bạn muốn một cái gì đó di động (nền tảng chéo), các bài đăng khác cung cấp các giải pháp có thể đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.