Câu trả lời:
Đến bữa tiệc muộn, nhưng các nút-windows cũng sẽ thực hiện thủ thuật này.
Nó cũng có hệ thống đăng nhập được xây dựng trong.
Có một API để tạo tập lệnh từ mã, tức là
var Service = require('node-windows').Service;
// Create a new service object
var svc = new Service({
name:'Hello World',
description: 'The nodejs.org example web server.',
script: 'C:\\path\\to\\helloworld.js'
});
// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
svc.start();
});
svc.install();
FD: Tôi là tác giả của mô-đun này.
Tôi thấy điều này hữu ích đến nỗi tôi đã xây dựng một trình bao bọc thậm chí còn dễ sử dụng hơn xung quanh nó ( npm , github ).
Cài đặt nó:
npm install -g qckwinsvc
Cài đặt dịch vụ của bạn:
qckwinsvc
prompt: Service name: [name for your service]
prompt: Service description: [description for it]
prompt: Node script path: [path of your node script]
Service installed
Gỡ cài đặt dịch vụ của bạn:
qckwinsvc - cài đặt
prompt: Service name: [name of your service]
prompt: Node script path: [path of your node script]
Service stopped
Service uninstalled
WinSer là một trình bao bọc thân thiện với node.js xung quanh NSSM (Trình quản lý dịch vụ không hút) phổ biến
Tiếp theo, tôi muốn lưu trữ nút như một dịch vụ, giống như IIS. Bằng cách này, nó sẽ khởi động với máy của tôi, chạy trong nền, tự động khởi động lại nếu nó gặp sự cố.
Đây là nơi nssm , người quản lý dịch vụ không hút, nhập vào hình ảnh. Công cụ này cho phép bạn lưu trữ một .exe bình thường như một dịch vụ Windows.
Dưới đây là các lệnh tôi đã sử dụng để thiết lập một phiên bản của ứng dụng nút của bạn dưới dạng dịch vụ, mở cmd của bạn như quản trị viên và nhập các lệnh sau:
nssm.exe install service_name c:\your_nodejs_directory\node.exe c:\your_application_directory\server.js net start service_name
Tôi không trực tiếp giải quyết câu hỏi, nhưng cung cấp một giải pháp thay thế cũng có thể đáp ứng yêu cầu của bạn theo cách thức thời trang hơn node.js.
Về mặt chức năng, các yêu cầu là:
Những yêu cầu này có thể được thỏa mãn bằng cách sử dụng trình quản lý quy trình (PM) và làm cho trình quản lý quy trình bắt đầu khởi động hệ thống. Hai PM tốt thân thiện với Windows là:
Để làm cho PM bắt đầu tự động, cách đơn giản nhất là tạo một tác vụ theo lịch trình với trình kích hoạt "Khi khởi động":
pm2
sử dụng tập lệnh bó khi khởi động, hãy chắc chắn bao gồm các biến môi trường nếu không nó sẽ không hoạt động. Thảo luận ở đây: github.com/Unitech/pm2/issues/1079
Trình quản lý quy trình + cách tiếp cận lập lịch tác vụ tôi đã đăng một năm trước hoạt động tốt với một số cài đặt dịch vụ một lần. Nhưng gần đây tôi bắt đầu thiết kế hệ thống theo kiểu dịch vụ vi mô, với nhiều dịch vụ nhỏ nói chuyện với nhau thông qua IPC. Vì vậy, cấu hình thủ công từng dịch vụ đã trở nên không thể chịu đựng được.
Hướng tới mục tiêu cài đặt dịch vụ mà không cần cấu hình thủ công, tôi đã tạo serman , một công cụ dòng lệnh (cài đặt với npm i -g serman
) để cài đặt một tệp thực thi như một dịch vụ. Tất cả những gì bạn cần viết (và chỉ viết một lần) là một tệp cấu hình dịch vụ đơn giản cùng với tệp thực thi của bạn. Chạy
serman install <path_to_config_file>
sẽ cài đặt dịch vụ. stdout
và stderr
tất cả đều được ghi lại. Để biết thêm thông tin, hãy xem trang web của dự án .
Một tập tin cấu hình làm việc rất đơn giản, như thể hiện dưới đây. Nhưng nó cũng có nhiều tính năng hữu ích như <env>
và <persistent_env>
bên dưới.
<service>
<id>hello</id>
<name>hello</name>
<description>This service runs the hello application</description>
<executable>node.exe</executable>
<!--
{{dir}} will be expanded to the containing directory of your
config file, which is normally where your executable locates
-->
<arguments>"{{dir}}\hello.js"</arguments>
<logmode>rotate</logmode>
<!-- OPTIONAL FEATURE:
NODE_ENV=production will be an environment variable
available to your application, but not visible outside
of your application
-->
<env name="NODE_ENV" value="production"/>
<!-- OPTIONAL FEATURE:
FOO_SERVICE_PORT=8989 will be persisted as an environment
variable machine-wide.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>