将nodejs启动成系统服务
通常会需要在本地启动一个或多个node服务器,但是一般情况下,都是用cmd命令窗口进行启动,启动服务器后,服务器的日志就输出到这个cmd窗口中,这样就可能会占用好几个cmd窗口(必须要同时保持打开),所以很不方便。
所以,如果能将cmd窗口在后台静默的启动并运行,将会方便很多。这个功能可以用 node-windows 这个包来实现。
node-windows
npm官网: https://www.npmjs.com/package/node-windows
github官网: https://github.com/coreybutler/node-windows
安装
npm install node-windows@1.0.0-beta.6 --save
注意,不能使用最新版本,最新版本有问题,启动不了,版本太低了也有问题,目前经测试,beta.6版本是可以的。
service-install.js 运行这个文件即可安装windows系统服务
var Service = require('node-windows').Service; // Create a new service object var svc = new Service({ name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe description: 'The nodejs.org example web server.', // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址 script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址 // nodeOptions: [ // '--harmony', // '--max_old_space_size=4096' // ] //, workingDirectory: '...' //, allowServiceLogon: true }); svc.on('install', function () { // 服务安装完成的事件 svc.start(); // 安装完成后,立即启动 node.js }); svc.install(); // 安装服务
service-uninstall.js 运行这个文件即可卸载windows系统服务
var Service = require('node-windows').Service; // Create a new service object var svc = new Service({ name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe description: 'The nodejs.org example web server.', // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址 script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址 // nodeOptions: [ // '--harmony', // '--max_old_space_size=4096' // ] //, workingDirectory: '...' //, allowServiceLogon: true }); svc.on('uninstall', function () { // 卸载完成后的事件 console.log('Uninstall complete.'); console.log('The service exists: ', svc.exists); }); svc.uninstall(); // 从windows系统中卸载服务
service-restart.js 运行这个文件即可重启windows系统服务
var Service = require('node-windows').Service; var exec = require('child_process').exec; // Create a new service object var svc = new Service({ name: 'Hello World', // 服务的显示名,真正的服务名是 helloworld.exe , 即全部小写并去掉空格+exe description: 'The nodejs.org example web server.', // script: require('path').join(__dirname,'helloworld.js'), // 也可以用相对地址 script: 'C:\\path\\to\\helloworld.js', // 要运行的js文件地址 // nodeOptions: [ // '--harmony', // '--max_old_space_size=4096' // ] //, workingDirectory: '...' //, allowServiceLogon: true }); svc.on('start', function () { // 服务启动完成的事件 console.log('启动完成???'); // 注意,到这一步,虽然输出了启动完成,但如果项目中有报错,则会立即关闭服务且没有通知 checkStart(); }); svc.restart(); // 重启服务 svc.serviceName = svc.id + '.exe'; // 真正运行的服务名 function checkStart(){ setTimeout(()=>{ let cmdStr = `sc query ${svc.serviceName}`; exec(cmdStr, function(error, stdout, stderr) { if(!error){ if(stdout.indexOf('4 RUNNING') > -1){ console.log('真正的启动成功了!!'); return; } } }); console.error(error); }, 1000); }
注意事项
每次修改项目代码后,需要重启服务才能生效。可以运行 service-uninstall.js重启,也可以在任务管理器中重启服务,还可以在 我的电脑右键==》管理==》服务 中重启。
安装服务完成后,会自动在要运行的js文件的同目录下生成 acemon文件夹,里面有项目运行的日志(本来应该在控制台输出的那种),运行node-windows本身的错误日志,打包成的.exe文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?